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

8

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

Джашанк Джереми
источник

Ответы:

15

Основываясь на вдохновении, предоставленном MrDaniel , я решил запрограммировать простой маленький счетчик.

Снимок экрана главного окна

Исходный код для этого, за исключением пользовательского интерфейса, определенного как xib; использует фреймворки Foundation и AppKit (полные исходники и проект Xcode на 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

Иконки, используемые на панели инструментов, взяты из Tango Desktop Project .

Даниэль Бек
источник
1
как открыть его в Mac OSX?
Джон Смит
1
Хорошо
@Mecki Я добавил это к описанию репо некоторое время назад, когда заметил. К сожалению, я понятия не имею, почему, возможно, связано с ограничениями доступа для приложений к API универсального доступа, а бинарный файл не подписан. Или они даже убили это полностью.
Даниэль Бек
В Mac OS X 10.9.5 он хорошо работает для мыши, но также не фиксирует нажатия клавиш. Вы выяснили причину, Меки? Спасибо.
Jiakuan W
@JiakuanW Некоторое время назад я получил PR в репозитории GitHub, который утверждает, что решил эту проблему (не проверено).
Даниэль Бек
2

Typingstats отображает общее количество нажатий клавиш и различные другие метрики. Это не учитывает клики указывающего устройства все же.

LRI
источник
Вы сами пробовали? Меняет ли он раскладку клавиатуры в зависимости от того, что у вас на самом деле, или это всегда США?
Даниэль Бек
Приложение App Store, недоступное в Канаде и, возможно, в других местах.
Джастин
1

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

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

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown

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