Nút chuột và bộ đếm phím cho Mac OS X


8

Có các kỹ thuật cho LinuxWindows , nhưng có cách nào để đếm các sự kiện chuột và bàn phím trong Mac OS X không? Tôi thích làm phân tích thống kê về hoạt động hàng ngày của tôi.

Câu trả lời:


15

Dựa trên cảm hứng được cung cấp bởi MrDaniel , tôi quyết định lập trình một quầy nhỏ đơn giản.

Ảnh chụp màn hình của cửa sổ chính

Mã nguồn cho điều này, trừ UI được định nghĩa là xib; sử dụng khung Foundation và AppKit (nguồn đầy đủ và dự án Xcode trên 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

Các biểu tượng được sử dụng trên thanh công cụ là từ Tango Desktop Project .


1
Làm thế nào để mở nó trong mac osx?
john Smith

1
Hoạt động tốt cho chuột nhưng không chụp phím bấm trong 10.10 :(
Mecki

@Mecki Tôi đã thêm nó vào mô tả repo một lúc trước khi tôi nhận thấy. Thật không may, tôi không biết tại sao, có thể liên quan đến các hạn chế truy cập trên mỗi ứng dụng đối với API truy cập chung và tệp nhị phân không được ký. Hoặc thậm chí họ đã giết chết hoàn toàn.
Daniel Beck

Trên Mac OS X 10.9.5, nó hoạt động tốt cho chuột nhưng cũng không chụp phím nhấn. Bạn đã tìm ra lý do, Mecki? Cảm ơn.
Jiakuan W

@JiakuanW Tôi đã có một PR trong kho lưu trữ GitHub tuyên bố giải quyết vấn đề này (chưa được kiểm tra).
Daniel Beck


2

Typingstats hiển thị tổng số tổ hợp phím và nhiều số liệu khác. Nó không tính số lần nhấp thiết bị mặc dù.


Bạn đã thử nó chưa? Nó có thay đổi cách bố trí bàn phím dựa trên những gì bạn thực sự có hoặc luôn luôn là Hoa Kỳ không?
Daniel Beck

Ứng dụng App Store, không có sẵn ở Canada và có thể ở nơi khác.
Justin

1

Một chương trình truy cập nhấn và nhấn nút có thể thông qua việc viết chương trình Cacao Objective-C có thể nhận và đếm các sự kiện nhấp chuột và bàn phím.

Lớp cần xem xét là NSEvent cụ thể là addGlobalMonitorForEventsMatchingMask: handler: phương thức lớp nên chứng minh là rất hữu ích. Vì nó cung cấp để theo dõi các sự kiện như:

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown


3
Hãy cố gắng trả lời theo cách thực sự đưa người dùng đến gần hơn với mục tiêu của mình. Chỉ bảo anh học lập trình thôi. Ví dụ, bạn có thể cung cấp các đoạn mã có liên quan hoặc các lệnh gọi hàm, ý chính của một giải pháp thực tế. Mặc dù vẫn không hữu ích cho mọi người, nó có thể được sử dụng làm nền tảng bởi những người khác để cung cấp một giải pháp làm việc.
Daniel Beck

Cuộc gọi tốt Daniel Beck có vẻ như tôi đã sử dụng sai phương pháp khi đề xuất sử dụng "Nguyên tắc lập trình truy cập cho ca cao", sau khi đọc thêm, tôi được chỉ vào lớp NSEvent, có vẻ như nó sẽ thực hiện công việc ...
MrDaniel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.