Bouton de la souris et compteur de touches pour Mac OS X


8

Il existe des techniques pour Linux et Windows , mais existe-t-il un moyen de compter les événements de souris et de clavier sous Mac OS X? Je souhaite faire une analyse statistique de mon activité quotidienne.

Réponses:


15

Sur la base de l' inspiration fournie par MrDaniel , j'ai décidé de programmer un simple petit compteur.

Capture d'écran de la fenêtre principale

Le code source pour cela, moins l'interface utilisateur définie comme xib; utilise les frameworks Foundation et AppKit (sources complètes et projet Xcode sur GitHub ):

DBAppDelegate.h

//
//  DBAppDelegate.h
//  CocoaActivityCounter
//
//  Created by Daniel Beck on 29.07.2012.
//  Copyright (c) 2012 Daniel Beck. All rights reserved.
//

#import <Cocoa/Cocoa.h>

static id monitorLeftMouseDown;
static id monitorRightMouseDown;
static id monitorKeyDown;

@interface DBAppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (strong) IBOutlet NSTextView *logView;

@property (weak) IBOutlet NSToolbarItem *toolbarStartButton;
@property (weak) IBOutlet NSToolbarItem *toolbarStopButton;
@property (weak) IBOutlet NSToolbarItem *toolbarClearButton;

@property (weak) IBOutlet NSTextField *keyPressCounterLabel;
@property (weak) IBOutlet NSTextField *leftMouseCounterLabel;
@property (weak) IBOutlet NSTextField *rightMouseCounterLabel;

@property (readwrite) NSDateFormatter *logDateFormatter;

@property (readwrite) NSNumber *keyPressCounter;
@property (readwrite) NSNumber *leftMouseCounter;
@property (readwrite) NSNumber *rightMouseCounter;

@property (readwrite) BOOL loggingEnabled;

- (IBAction)stopButtonPressed:(id)sender;
- (IBAction)startButtonPressed:(id)sender;
- (IBAction)clearButtonPressed:(id)sender;

- (void)logMessageToLogView:(NSString*)message;

- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem;

@end

DBAppDelegate.m

//
//  DBAppDelegate.m
//  CocoaActivityCounter
//
//  Created by Daniel Beck on 29.07.2012.
//  Copyright (c) 2012 Daniel Beck. All rights reserved.
//

#import "DBAppDelegate.h"
#import <AppKit/NSEvent.h>

@implementation DBAppDelegate
@synthesize logView;
@synthesize toolbarStartButton;
@synthesize toolbarStopButton;
@synthesize keyPressCounterLabel;
@synthesize leftMouseCounterLabel;
@synthesize rightMouseCounterLabel;
@synthesize toolbarClearButton;
@synthesize loggingEnabled;

@synthesize keyPressCounter;
@synthesize leftMouseCounter;
@synthesize rightMouseCounter;


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.loggingEnabled = NO;
    self.logDateFormatter = [[NSDateFormatter alloc] init];
    [self.logDateFormatter setTimeStyle:NSDateFormatterMediumStyle];
    self.keyPressCounter = [NSNumber numberWithInt:0];
    self.leftMouseCounter = [NSNumber numberWithInt:0];
    self.rightMouseCounter = [NSNumber numberWithInt:0];
}

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication {
    return YES;
}

-(void)logMessageToLogView:(NSString*)message {
    [logView setString: [[logView string] stringByAppendingFormat:@"%@: %@\n", [self.logDateFormatter stringFromDate:[NSDate date]],  message]];
}

- (IBAction)stopButtonPressed:(id)sender {
    if (!self.loggingEnabled) {
        return;
    }
    self.loggingEnabled = false;
    [NSEvent removeMonitor:monitorLeftMouseDown];
    [NSEvent removeMonitor:monitorRightMouseDown];
    [NSEvent removeMonitor:monitorKeyDown];
}

- (IBAction)startButtonPressed:(id)sender {

    if (self.loggingEnabled) {
        return;
    }
    self.loggingEnabled = true;
    monitorLeftMouseDown = [NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDownMask handler:^(NSEvent *evt) {
        [self logMessageToLogView:[NSString stringWithFormat:@"Left mouse down!"]];
        self.leftMouseCounter = [NSNumber numberWithInt:(1 + [self.leftMouseCounter intValue])];
    }];
    monitorRightMouseDown = [NSEvent addGlobalMonitorForEventsMatchingMask:NSRightMouseDownMask handler:^(NSEvent *evt) {
        [self logMessageToLogView:@"Right mouse down!"];
        self.rightMouseCounter = [NSNumber numberWithInt:(1 + [self.rightMouseCounter intValue])];
    }];
    monitorKeyDown = [NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *evt) {
        [self logMessageToLogView:[NSString stringWithFormat:@"Key down: %@ (key code %d)", [evt characters], [evt keyCode]]];
        self.keyPressCounter = [NSNumber numberWithInt:(1 + [self.keyPressCounter intValue])];
    }];
}

- (IBAction)clearButtonPressed:(id)sender {
    self.keyPressCounter = [NSNumber numberWithInt:0];
    self.leftMouseCounter = [NSNumber numberWithInt:0];
    self.rightMouseCounter = [NSNumber numberWithInt:0];
    [self.logView setString:@""];
}

- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem {
    if ([theItem isEqualTo:toolbarStartButton]) {
        return !self.loggingEnabled;
    }
    if ([theItem isEqualTo:toolbarStopButton]) {
        return self.loggingEnabled;
    }
    if ([theItem isEqualTo:toolbarClearButton]) {
        return !self.loggingEnabled;
    }
    return YES;
}

@end

Les icônes utilisées dans la barre d'outils proviennent de Tango Desktop Project .


1
comment l'ouvrir dans mac osx?
John Smith

1
Fonctionne bien pour la souris mais ne capture pas les pressions sur les touches en 10.10 :(
Mecki

@Mecki J'ai ajouté cela à la description du dépôt il y a quelque temps quand j'ai remarqué. Malheureusement, je ne sais pas pourquoi, peut-être lié aux restrictions d'accès par application à l'API d'accès universel et au binaire non signé. Ou ils ont même tout tué.
Daniel Beck

Sur Mac OS X 10.9.5, il fonctionne bien pour la souris mais ne capture pas non plus les pressions sur les touches. Avez-vous compris la raison, Mecki? Merci.
Jiakuan W du

@JiakuanW J'ai reçu un PR il y a quelque temps dans le référentiel GitHub qui prétend résoudre ce problème (non testé).
Daniel Beck


2

Typingstats affiche un nombre total de frappes et diverses autres mesures. Cependant, il ne compte pas les clics sur le périphérique de pointage.


L'avez-vous essayé vous-même? Cela change-t-il la disposition du clavier en fonction de ce que vous avez vraiment ou est-ce toujours aux États-Unis?
Daniel Beck

Application App Store, non disponible au Canada et peut-être ailleurs.
Justin

1

Un programme de comptage des clics et des boutons est possible via l'écriture d'un programme Cocoa Objective-C qui peut recevoir et compter les événements de clics de souris et de clavier.

La classe à examiner est NSEvent spécifiquement la méthode addGlobalMonitorForEventsMatchingMask: handler: class devrait s'avérer très utile. Puisqu'il propose de surveiller des événements tels que:

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown


3
Veuillez essayer de répondre d'une manière qui rapproche réellement l'utilisateur de son objectif. Il ne suffit pas de lui dire d'apprendre la programmation. Vous pouvez, par exemple, fournir des extraits de code ou des appels de fonction pertinents, l'essentiel d'une solution réelle. Bien qu'il ne soit toujours pas utile à tout le monde, il pourrait servir de base à d'autres pour fournir une solution de travail.
Daniel Beck

Bon appel, Daniel Beck semble avoir adopté la mauvaise approche en suggérant d'utiliser les "directives de programmation d'accessibilité pour Cocoa", après une lecture plus approfondie, j'ai été pointé vers la classe NSEvent, qui semble faire l'affaire ...
MrDaniel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.