Maustaste und Tastendruckschalter für Mac OS X

10692
Jashank Jeremy

Es gibt Techniken für Linux und Windows, aber gibt es eine Möglichkeit, Maus- und Tastaturereignisse in Mac OS X zu zählen? Ich interessiere mich für die statistische Analyse meiner täglichen Aktivitäten.

8

4 Antworten auf die Frage

15
Daniel Beck

Aufgrund der Inspiration von MrDaniel entschied ich mich, eine einfache kleine Theke zu programmieren.

Screenshot of the main window

Der Quellcode hierfür, abzüglich der definierten Benutzeroberfläche xib; verwendet Foundation- und AppKit-Frameworks (vollständige Quellen und Xcode-Projekt auf 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 

In der Symbolleiste verwendete Symbole stammen aus Tango Desktop Project .

wie man es in mac osx öffnet? john Smith vor 10 Jahren 1
Funktioniert gut für die Maus, erfasst jedoch keine Tastendrücke in 10.10 :( Mecki vor 9 Jahren 1
@Mecki Ich habe das vor einiger Zeit der Repo-Beschreibung hinzugefügt, als ich es bemerkte. Leider habe ich keine Ahnung warum, möglicherweise bezogen auf App-Zugriffsbeschränkungen für die universelle Zugriffs-API, und die Binärdatei ist unsigniert. Oder sie töteten das sogar ganz. Daniel Beck vor 9 Jahren 0
Unter Mac OS X 10.9.5 funktioniert es gut für die Maus, erfasst jedoch auch keine Tastendrücke. Hast du den Grund herausgefunden, Mecki? Vielen Dank. Jiakuan W vor 9 Jahren 0
@JiakuanW Ich habe vor einiger Zeit einen PR im GitHub-Repository erhalten, der behauptet, dieses Problem zu lösen (ungeprüft). Daniel Beck vor 9 Jahren 0
Danke für deine Antwort. Ja, ich habe den Code überprüft, checkAccessibility () ist besonders nützlich. Jetzt kann meine App auch Tastaturereignisse erfassen. Jiakuan W vor 9 Jahren 0
3
Iszi

WhatPulse runs on Windows, OS X, and Linux.

Thanks to Vsauce for pointing this one out.

2
user495470

Typingstats zeigt eine Gesamtzahl von Tastenanschlägen und verschiedene andere Metriken an. Zeigegeräte-Klicks zählen jedoch nicht.

Hast du es selbst ausprobiert? Ändert es das Tastaturlayout basierend auf dem, was Sie wirklich haben, oder ist es immer USA? Daniel Beck vor 12 Jahren 0
App Store App, nicht in Kanada und möglicherweise anderswo verfügbar. Justin vor 7 Jahren 0
1
MrDaniel

Ein Klick- und Tastenzählerprogramm ist durch Schreiben eines Cocoa Objective-C-Programms möglich, das Maus- und Tastaturklickereignisse empfangen und zählen kann.

Die Klasse, die Sie sich ansehen sollten, ist NSEvent. Speziell die addGlobalMonitorForEventsMatchingMask: handler: Klassenmethode sollte sich als sehr hilfreich erweisen. Da bietet es an, Ereignisse zu überwachen, wie:

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown

Bitte versuchen Sie, auf eine Weise zu antworten, die den Benutzer tatsächlich seinem Ziel näher bringt. Ihm nur zu sagen, er solle das Programmieren nicht lernen. Sie können beispielsweise relevante Code-Snippets oder Funktionsaufrufe bereitstellen, die den Kern einer tatsächlichen Lösung darstellen. Sie ist zwar noch nicht für alle von Nutzen, kann aber von anderen als Grundlage für eine funktionierende Lösung genutzt werden. Daniel Beck vor 12 Jahren 3
Guter Aufruf Daniel Beck sieht so aus, als würde ich falsch vorgehen, als ich schlug, die "Richtlinien für die Barrierefreiheit für Kakao" zu verwenden. Nach weiterem Lesen wurde ich auf die NSEvent-Klasse hingewiesen, die den Job zu erledigen scheint ... MrDaniel vor 12 Jahren 0