Tombol mouse dan penghitung penekanan tombol untuk Mac OS X

8

Ada teknik untuk Linux dan Windows , tetapi apakah ada cara untuk menghitung acara mouse dan keyboard di Mac OS X? Saya tertarik melakukan analisis statistik aktivitas harian saya.

Jashank Jeremy
sumber

Jawaban:

15

Berdasarkan inspirasi yang diberikan oleh MrDaniel , saya memutuskan untuk membuat program penghitung kecil sederhana.

Cuplikan layar jendela utama

Kode sumber untuk ini, minus UI yang didefinisikan sebagai xib; menggunakan kerangka kerja Foundation dan AppKit (sumber lengkap dan proyek Xcode di 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

Ikon yang digunakan di bilah alat berasal dari Tango Desktop Project .

Daniel Beck
sumber
1
bagaimana cara membukanya di mac osx?
john Smith
1
Berfungsi bagus untuk mouse tetapi tidak menangkap penekanan tombol di 10.10 :(
Mecki
@Mecki saya menambahkan itu ke deskripsi repo beberapa waktu lalu ketika saya perhatikan. Sayangnya saya tidak tahu mengapa, mungkin terkait dengan pembatasan akses per-aplikasi ke API akses universal, dan biner tidak ditandatangani. Atau mereka bahkan membunuh ini sepenuhnya.
Daniel Beck
Pada Mac OS X 10.9.5, ini berfungsi dengan baik untuk mouse tetapi tidak menangkap penekanan tombol juga. Sudahkah Anda menemukan alasannya, Mecki? Terima kasih.
Jiakuan W
@JiakuanW Saya mendapatkan PR beberapa waktu lalu di repositori GitHub yang mengklaim dapat mengatasi masalah ini (belum teruji).
Daniel Beck
4

WhatPulse berjalan di Windows, OS X, dan Linux.

Terima kasih kepada Vsauce karena menunjukkan ini.

Iszi
sumber
2

Typingstats menampilkan jumlah penekanan tombol dan berbagai metrik lainnya. Itu tidak menghitung klik perangkat yang menunjuk.

Lri
sumber
Sudahkah Anda mencobanya sendiri? Apakah itu mengubah tata letak keyboard berdasarkan apa yang Anda miliki atau apakah itu selalu AS?
Daniel Beck
Aplikasi App Store, tidak tersedia di Kanada dan mungkin di tempat lain.
Justin
1

Program penghitung klik dan tombol dimungkinkan melalui penulisan program Cocoa Objective-C yang dapat menerima dan menghitung peristiwa klik mouse dan keyboard.

Kelas yang perlu dilihat adalah NSEvent khusus addGlobalMonitorForEventsMatchingMask: handler: metode kelas harus terbukti sangat membantu. Karena menawarkan untuk memantau acara seperti:

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown

MrDaniel
sumber
3
Silakan coba menjawab dengan cara yang benar-benar membawa pengguna lebih dekat ke tujuannya. Hanya mengatakan kepadanya untuk belajar pemrograman tidak. Misalnya, Anda dapat memberikan cuplikan kode atau panggilan fungsi yang relevan, inti dari solusi aktual. Meskipun masih tidak berguna bagi semua orang, itu dapat digunakan sebagai fondasi oleh orang lain untuk memberikan solusi kerja.
Daniel Beck
Panggilan yang bagus Daniel Beck sepertinya saya mengambil pendekatan yang salah ketika menyarankan menggunakan "Pedoman Pemrograman Aksesibilitas untuk Kakao", setelah membaca lebih lanjut saya diarahkan ke kelas NSEvent, yang sepertinya akan melakukan tugasnya ...
MrDaniel