Pulsante del mouse e contatore di tasti per Mac OS X.


8

Esistono tecniche per Linux e Windows , ma esiste un modo per contare gli eventi di mouse e tastiera in Mac OS X? Sono interessato a fare analisi statistiche della mia attività quotidiana.

Risposte:


15

Basandomi sull'ispirazione di Mr Daniel , ho deciso di programmare un semplice piccolo contatore.

Schermata della finestra principale

Il codice sorgente per questo, meno l'interfaccia utente definita come xib; utilizza framework Foundation e AppKit (sorgenti complete e progetto Xcode su 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

Le icone utilizzate nella barra degli strumenti provengono da Tango Desktop Project .


1
come aprirlo in mac osx?
John Smith,

1
Funziona bene con il mouse ma non acquisisce la pressione dei tasti in 10.10 :(
Mecki

@Mecki L'ho aggiunto alla descrizione del repository qualche tempo fa quando l'ho notato. Sfortunatamente non ho idea del perché, possibilmente correlato alle restrizioni di accesso per app all'API di accesso universale e al fatto che il binario sia senza segno. O l'hanno persino ucciso del tutto.
Daniel Beck

Su Mac OS X 10.9.5, funziona bene con il mouse ma non acquisisce anche la pressione dei tasti. Hai capito il motivo, Mecki? Grazie.
Jiakuan W

@JiakuanW Ho ottenuto un PR qualche tempo fa nel repository GitHub che afferma di risolvere questo problema (non testato).
Daniel Beck


2

Typingstats visualizza un numero totale di sequenze di tasti e varie altre metriche. Tuttavia, non conta i clic del dispositivo di puntamento.


L'hai provato tu stesso? Cambia il layout della tastiera in base a ciò che hai veramente o è sempre negli Stati Uniti?
Daniel Beck

App Store, non disponibile in Canada e forse altrove.
Giustino,

1

È possibile creare un programma contatore di clic e pulsanti scrivendo un programma Cocoa Objective-C in grado di ricevere e contare gli eventi di clic del mouse e della tastiera.

La classe da dare un'occhiata è NSEvent in particolare l' addGlobalMonitorForEventsMatchingMask: gestore: il metodo di classe dovrebbe rivelarsi molto utile. Dal momento che offre di monitorare eventi come:

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown


3
Prova a rispondere in un modo che avvicini l'utente al suo obiettivo. Dirgli solo di imparare a programmare non lo fa. Ad esempio, è possibile fornire frammenti di codice o chiamate di funzione pertinenti, l'essenza di una soluzione effettiva. Sebbene non sia ancora utile a tutti, potrebbe essere usato come base da altri per fornire una soluzione funzionante.
Daniel Beck

Buona telefonata Daniel Beck sembra che stia adottando un approccio sbagliato quando mi ha suggerito di utilizzare le "Linee guida per la programmazione dell'accessibilità per il cacao", dopo aver letto più tardi sono stato segnalato alla classe NSEvent, che sembra che farà il lavoro ...
MrDaniel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.