Кнопка мыши и счетчик нажатий клавиш для Mac OS X

10706
Jashank Jeremy

Есть методы для Linux и Windows, но есть ли способ подсчета событий мыши и клавиатуры в Mac OS X? Я заинтересован в проведении статистического анализа моей повседневной деятельности.

8

4 ответа на вопрос

15
Daniel Beck

Based on the inspiration provided by MrDaniel, I decided to program a simple little counter.

Screenshot of the main window

The source code for this, minus the UI defined as xib; uses Foundation and AppKit frameworks (full sources and Xcode project on 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 

Icons used in the toolbar are from Tango Desktop Project.

как открыть его в Mac OSX? john Smith 10 лет назад 1
Работает хорошо для мыши, но не фиксирует нажатия клавиш в 10.10 :( Mecki 9 лет назад 1
@Mecki Я добавил это в описание репо некоторое время назад, когда заметил. К сожалению, я понятия не имею, почему, возможно, связано с ограничениями доступа для приложений к универсальному API доступа и неподписанным двоичным кодом. Или они даже убили это полностью. Daniel Beck 9 лет назад 0
В Mac OS X 10.9.5 он хорошо работает для мыши, но не фиксирует нажатия клавиш. Вы выяснили причину, Меки? Благодарю. Jiakuan W 9 лет назад 0
@JiakuanW Я недавно получил PR в репозитории GitHub, который утверждает, что решил эту проблему (не проверено). Daniel Beck 9 лет назад 0
Спасибо за ваш ответ. Да, я проверил этот код, особенно полезен checkAccessibility (). Теперь мое приложение может также захватывать события клавиатуры. Jiakuan W 9 лет назад 0
3
Iszi

WhatPulse работает в Windows, OS X и Linux.

Спасибо Vsauce за указание на это.

2
user495470

Typingstats displays a total number of keystrokes and various other metrics. It doesn't count pointing device clicks though.

Вы сами пробовали? Меняет ли он раскладку клавиатуры в зависимости от того, что у вас на самом деле, или это всегда США? Daniel Beck 12 лет назад 0
Приложение App Store, недоступное в Канаде и, возможно, в других местах. Justin 7 лет назад 0
1
MrDaniel

Программа счетчика нажатий и нажатий кнопок возможна благодаря написанию программы Cocoa Objective-C, которая может получать и считать события щелчков мыши и клавиатуры.

Класс, на который нужно взглянуть, - это NSEvent, в частности метод addGlobalMonitorForEventsMatchingMask: handler: class должен оказаться очень полезным. Так как он предлагает для мониторинга таких событий, как:

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown

Пожалуйста, попробуйте ответить так, чтобы пользователь действительно приблизился к своей цели. Просто сказать ему, чтобы научиться программированию, нет. Вы можете, например, предоставить соответствующие фрагменты кода или вызовы функций, суть реального решения. Несмотря на то, что он по-прежнему бесполезен для всех, он может использоваться другими в качестве основы для предоставления рабочего решения. Daniel Beck 12 лет назад 3
Хороший вызов Даниэль Бек выглядит так, как будто я использовал неправильный подход, предлагая использовать «Руководство по программированию специальных возможностей для какао», после дальнейшего прочтения я указал на класс NSEvent, который, похоже, сработает ... MrDaniel 12 лет назад 0