Maustaste und Tastendruckzähler für Mac OS X.

8

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 bin daran interessiert, statistische Analysen meiner täglichen Aktivitäten durchzuführen.

Jashank Jeremy
quelle

Antworten:

15

Aufgrund der Inspiration von MrDaniel habe ich beschlossen, einen einfachen kleinen Zähler zu programmieren.

Screenshot des Hauptfensters

Der Quellcode hierfür abzüglich der Benutzeroberfläche definiert als 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

Die in der Symbolleiste verwendeten Symbole stammen aus Tango Desktop Project .

Daniel Beck
quelle
1
Wie öffne ich es in Mac OSX?
John Smith
1
Funktioniert gut für die Maus, erfasst aber keine Tastendrücke in 10.10 :(
Mecki
@Mecki Ich habe das vor einiger Zeit zur Repo-Beschreibung hinzugefügt, als ich es bemerkte. Leider habe ich keine Ahnung warum, möglicherweise im Zusammenhang mit pro-App-Zugriffsbeschränkungen für die universelle Zugriffs-API, und die Binärdatei ist nicht signiert. Oder sie haben das sogar ganz getötet.
Daniel Beck
Unter Mac OS X 10.9.5 funktioniert es gut mit der Maus, erfasst jedoch auch keine Tastendrücke. Hast du den Grund herausgefunden, Mecki? Vielen Dank.
Jiakuan W
@JiakuanW Ich habe vor einiger Zeit eine PR im GitHub-Repository erhalten, die behauptet, dieses Problem zu lösen (ungetestet).
Daniel Beck
4

WhatPulse läuft unter Windows, OS X und Linux.

Vielen Dank an Vsauce für diesen Hinweis.

Iszi
quelle
2

Typingstats zeigt eine Gesamtzahl von Tastenanschlägen und verschiedenen anderen Metriken an. Das Zeigen von Geräteklicks zählt jedoch nicht.

Lri
quelle
Hast du es selbst versucht? Ändert es das Tastaturlayout basierend auf dem, was Sie wirklich haben, oder ist es immer US?
Daniel Beck
App Store App, nicht in Kanada und möglicherweise anderswo verfügbar.
Justin
1

Ein Zähler- und Tastendruck-Zählerprogramm ist möglich, indem ein Cocoa Objective-C-Programm geschrieben wird, das Maus- und Tastaturklickereignisse empfangen und zählen kann.

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

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown

MrDaniel
quelle
3
Bitte versuchen Sie, auf eine Weise zu antworten, die den Benutzer tatsächlich seinem Ziel näher bringt. Ihm nur zu sagen, er soll Programmieren lernen, geht nicht. Sie können beispielsweise relevante Codefragmente oder Funktionsaufrufe bereitstellen, die den Kern einer tatsächlichen Lösung darstellen. Obwohl es immer noch nicht für alle nützlich ist, könnte es von anderen als Grundlage für eine funktionierende Lösung verwendet werden.
Daniel Beck
Guter Anruf Daniel Beck sieht so aus, als hätte ich den falschen Ansatz gewählt, als ich vorgeschlagen habe, die "Richtlinien für die Programmierung der Barrierefreiheit für Kakao" zu verwenden. Nach weiterer Lektüre wurde ich auf die NSEvent-Klasse hingewiesen, die anscheinend den Job machen wird ...
MrDaniel