Przycisk myszy i licznik naciśnięć klawiszy w systemie Mac OS X

8

Istnieją techniki dla Linuksa i Windowsa , ale czy istnieje sposób liczenia zdarzeń myszy i klawiatury w Mac OS X? Jestem zainteresowany analizą statystyczną mojej codziennej aktywności.

Jashank Jeremy
źródło

Odpowiedzi:

15

Na podstawie inspiracji MrDaniela postanowiłem zaprogramować prosty mały licznik.

Zrzut ekranu głównego okna

Kod źródłowy tego, minus interfejs użytkownika zdefiniowany jako xib; używa frameworków Foundation i AppKit (pełne źródła i projekt Xcode na 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

Ikony używane na pasku narzędzi pochodzą z Tango Desktop Project .

Daniel Beck
źródło
1
jak otworzyć w Mac OSX?
John Smith,
1
Działa dobrze dla myszy, ale nie przechwytuje naciśnięć klawiszy w 10.10 :(
Mecki
@ Mecki Dodałem to do opisu repozytorium, gdy zauważyłem. Niestety nie mam pojęcia, dlaczego, być może związane z ograniczeniami dostępu dla aplikacji do interfejsu uniwersalnego dostępu API i binarnym niepodpisaniem. A nawet zabili to całkowicie.
Daniel Beck
W systemie Mac OS X 10.9.5 działa dobrze dla myszy, ale nie przechwytuje również naciśnięć klawiszy. Czy odkryłeś przyczynę, Mecki? Dzięki.
Jiakuan W
@JiakuanW Mam już jakiś PR w repozytorium GitHub, który twierdzi, że rozwiązał ten problem (niesprawdzony).
Daniel Beck
4

WhatPulse działa w systemach Windows, OS X i Linux.

Dzięki Vsauce za wskazanie tego.

Iszi
źródło
2

Typingstats wyświetla całkowitą liczbę naciśnięć klawiszy i różne inne metryki. Nie liczy się jednak kliknięć urządzenia wskazującego.

Lri
źródło
Próbowałeś tego sam? Czy zmienia układ klawiatury w oparciu o to, co naprawdę masz, czy zawsze jest to USA?
Daniel Beck
Aplikacja App Store, niedostępna w Kanadzie i prawdopodobnie gdzie indziej.
Justin
1

Program licznika kliknięć i naciśnięć przycisków jest możliwy poprzez napisanie programu Cocoa Objective-C, który może odbierać i liczyć zdarzenia kliknięcia myszą i klawiaturą.

Klasą do obejrzenia jest NSEvent, a szczególnie metoda addGlobalMonitorForEventsMatchingMask: handler: metoda powinna okazać się bardzo pomocna. Ponieważ oferuje monitorowanie zdarzeń, takich jak:

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown

MrDaniel
źródło
3
Spróbuj odpowiedzieć w sposób, który faktycznie przybliża użytkownika do jego celu. Samo powiedzenie mu, żeby się uczył programowania, nie robi tego. Możesz na przykład podać odpowiednie fragmenty kodu lub wywołania funkcji, będące sednem rzeczywistego rozwiązania. Choć nadal nie jest przydatny dla wszystkich, inni mogą go wykorzystać jako podstawę do zapewnienia działającego rozwiązania.
Daniel Beck
Dobra rozmowa Daniel Beck wygląda na to, że podjąłem niewłaściwe podejście, sugerując użycie „Wytycznych dotyczących programowania dostępności dla kakao”, po dalszej lekturze wskazano mi klasę NSEvent, która wydaje się, że to zadziała ...
MrDaniel