ปุ่มเมาส์และปุ่มกดตัวนับสำหรับ Mac OS X


8

มีเทคนิคสำหรับLinuxและWindowsแต่มีวิธีนับกิจกรรมเมาส์และคีย์บอร์ดใน Mac OS X หรือไม่? ฉันสนใจที่จะทำการวิเคราะห์ทางสถิติของกิจกรรมประจำวันของฉัน

คำตอบ:


15

จากแรงบันดาลใจที่ได้รับจาก MrDanielฉันตัดสินใจที่จะเขียนโปรแกรมตัวนับจำนวนเล็กน้อยอย่างง่าย

สกรีนช็อตของหน้าต่างหลัก

ซอร์สโค้ดสำหรับสิ่งนี้ลบ UI ที่กำหนดเป็นxib; ใช้ Foundation และ AppKit frameworks (ซอร์สเต็มและโครงการ 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

ไอคอนที่ใช้ในแถบเครื่องมือจากโครงการสก์ท็อปแทงโก้


1
วิธีเปิดใน mac osx
john Smith

1
ใช้งานได้ดีกับเมาส์ แต่ไม่สามารถกดปุ่มได้ใน 10.10 :(
Mecki

@Mecki ฉันได้เพิ่มสิ่งนั้นลงไปในคำอธิบาย repo กลับมาอีกครั้งเมื่อฉันสังเกตเห็น น่าเสียดายที่ฉันไม่รู้ว่าทำไมอาจเกี่ยวข้องกับข้อ จำกัด การเข้าถึงแอปต่อ Universal access API และไบนารีไม่ได้ลงนาม หรือพวกเขาฆ่าสิ่งนี้ออกไปโดยสิ้นเชิง
Daniel Beck

สำหรับ Mac OS X 10.9.5 ใช้งานได้ดีกับเมาส์ แต่ไม่สามารถกดปุ่มได้เช่นกัน คุณคิดหาเหตุผลแล้ว Mecki เหรอ? ขอบคุณ
Jiakuan W

@JiakuanW ฉันได้รับ PR กลับมาอีกครั้งในที่เก็บ GitHub ที่อ้างว่าแก้ไขปัญหานี้ (ยังไม่ทดลอง)
Daniel Beck


2

การพิมพ์ดีดแสดงจำนวนการกดแป้นทั้งหมดและตัวชี้วัดอื่น ๆ มันไม่นับการคลิกของอุปกรณ์ตัวชี้


คุณลองด้วยตัวเองหรือไม่? มันเปลี่ยนรูปแบบแป้นพิมพ์ตามสิ่งที่คุณมีอยู่จริงหรือเป็น US เสมอหรือไม่
Daniel Beck

แอพสโตร์ไม่มีในแคนาดาและที่อื่น ๆ
Justin

1

โปรแกรมตัวนับการคลิกและปุ่มสามารถทำได้ผ่านการเขียนโปรแกรม Cocoa Objective-C ที่สามารถรับและนับเหตุการณ์การคลิกเมาส์และแป้นพิมพ์

คลาสที่จะดูคือNSEventโดยเฉพาะaddGlobalMonitorForEventsMatchingMask: handler:เมธอด class ควรพิสูจน์ว่ามีประโยชน์มาก เนื่องจากมันมีการตรวจสอบเหตุการณ์เช่น:

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown


3
โปรดลองตอบด้วยวิธีที่นำผู้ใช้เข้าใกล้เป้าหมายมากขึ้น แค่บอกให้เขาเรียนรู้การเขียนโปรแกรมไม่ได้ ตัวอย่างเช่นคุณสามารถให้ตัวอย่างโค้ดที่เกี่ยวข้องหรือการเรียกใช้ฟังก์ชันส่วนสำคัญของโซลูชันที่แท้จริง ในขณะที่ยังไม่มีประโยชน์กับทุกคนมันสามารถใช้เป็นรากฐานโดยผู้อื่นเพื่อให้วิธีการทำงาน
Daniel Beck

การโทรที่ดี Daniel Beck ดูเหมือนว่าฉันกำลังใช้วิธีที่ไม่ถูกต้องเมื่อแนะนำให้ใช้ "แนวทางการเขียนโปรแกรมการเข้าถึงสำหรับโกโก้" หลังจากอ่านเพิ่มเติมฉันถูกชี้ไปที่ชั้นเรียน NSEvent ซึ่งดูเหมือนว่าจะทำงาน ...
MrDaniel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.