Кнопка миші та натискання лічильника для Mac OS X


8

Є методики для Linux і Windows , але чи є спосіб підрахувати події миші та клавіатури в Mac OS X? Мене цікавить статистичний аналіз своєї щоденної діяльності.

Відповіді:


15

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

Screenshot of the main window

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

Іконки, що використовуються на панелі інструментів, з Tango Desktop Project .


1
як відкрити його в Mac OSX?
john Smith

1
Добре працює для миші, але не знімає натискання клавіш у 10.10 :(
Mecki

@Mecki Я додав, що до опису репо деякий час назад, коли я помітив. На жаль, я не маю уявлення, чому, можливо, пов'язані з обмеженнями доступу до прикладних програм доступу до універсального доступу, а бінарний файл без знака. Або вони навіть цілком вбили це.
Daniel Beck

На Mac OS X 10.9.5, він працює добре для миші, але також не захоплює натискання клавіш. Ви зрозуміли причину, Мецкі? Дякую.
Jiakuan W

@JiakuanW Я отримав PR ще деякий час у сховищі GitHub, що претендує на вирішення цієї проблеми (неперевірена).
Daniel Beck


2

Введення станів відображає загальну кількість натискань на клавіші та інші показники. Проте він не враховує кліків вказівного пристрою.


Ви самі пробували? Чи змінюється розкладка клавіатури на основі того, що ви дійсно маєте, чи це завжди?
Daniel Beck

Додаток App Store, недоступний у Канаді та, можливо, в інших місцях.
Justin

1

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

Клас, на який можна подивитися, це NSEvent конкретно addGlobalMonitorForEventsMatchingMask: обробник: Метод класу повинен виявитися дуже корисним. Оскільки вона пропонує моніторинг подій, таких як:

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown


3
Будь ласка, спробуйте відповісти таким чином, що фактично наблизить користувача до своєї мети. Просто говорити йому, щоб навчитися програмуванню, ні. Можна, наприклад, надати відповідні фрагменти коду або виклики функцій, суть фактичного рішення. Незважаючи на те, що він не є корисним для всіх, він може бути використаний як основа для забезпечення робочого рішення.
Daniel Beck

Гарний виклик Даніель Бек виглядає так, ніби я використовував неправильний підхід, запропонувавши використовувати "Керівництво з програмування доступності для какао".
MrDaniel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.