Botón del mouse y contador de pulsaciones de teclas para Mac OS X

8

Existen técnicas para Linux y Windows , pero ¿hay alguna manera de contar eventos de mouse y teclado en Mac OS X? Estoy interesado en hacer un análisis estadístico de mi actividad diaria.

Jashank Jeremy
fuente

Respuestas:

15

Basado en la inspiración proporcionada por MrDaniel , decidí programar un pequeño contador simple.

Captura de pantalla de la ventana principal.

El código fuente para esto, menos la IU definida como xib; utiliza los marcos Foundation y AppKit (fuentes completas y proyecto Xcode en 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

Los iconos utilizados en la barra de herramientas son de Tango Desktop Project .

Daniel Beck
fuente
1
¿Cómo abrirlo en Mac OSX?
john Smith
1
Funciona bien para el mouse pero no captura las pulsaciones de teclas en 10.10 :(
Mecki
@Mecki Agregué eso a la descripción del repositorio hace un tiempo cuando me di cuenta. Desafortunadamente, no tengo idea de por qué, posiblemente relacionado con las restricciones de acceso por aplicación a la API de acceso universal, y el binario no está firmado. O incluso mataron esto por completo.
Daniel Beck
En Mac OS X 10.9.5, funciona bien para el mouse pero no captura las pulsaciones de teclas también. ¿Has descubierto la razón, Mecki? Gracias.
Jiakuan W
@JiakuanW Recibí un RP hace un tiempo en el repositorio de GitHub que dice resolver este problema (no probado).
Daniel Beck
2

Typingstats muestra un número total de pulsaciones de teclas y varias otras métricas. Sin embargo, no cuenta los clics del dispositivo señalador.

Lri
fuente
¿Lo has intentado tú mismo? ¿Cambia la distribución del teclado en función de lo que realmente tienes o es siempre de EE. UU.
Daniel Beck
Aplicación App Store, no disponible en Canadá y posiblemente en otros lugares.
Justin
1

Un programa de contador de clics y botones es posible al escribir un programa Cocoa Objective-C que puede recibir y contar eventos de clics del mouse y el teclado.

La clase a considerar es NSEvent específicamente el método addGlobalMonitorForEventsMatchingMask: handler: class debería ser muy útil. Ya que ofrece monitorear eventos como:

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown

MrDaniel
fuente
3
Intenta responder de una manera que realmente acerque al usuario a su objetivo. Solo decirle que aprenda programación no lo hace. Podría, por ejemplo, proporcionar fragmentos de código relevantes o llamadas a funciones, la esencia de una solución real. Si bien aún no es útil para todos, otros podrían usarlo como base para proporcionar una solución de trabajo.
Daniel Beck
Buena decisión Daniel Beck parece que estaba tomando un enfoque equivocado al sugerir el uso de las "Pautas de programación de accesibilidad para el cacao", después de leer más, me señalaron la clase NSEvent, que parece que hará el trabajo ...
MrDaniel