Mac OS X 용 마우스 버튼 및 키 누르기 카운터


답변:


15

MrDaniel이 제공 한 영감을 바탕으로 간단한 카운터를 프로그래밍하기로 결정했습니다.

메인 창의 스크린 샷

이를위한 소스 코드에서 UI를 빼고 xib; Foundation 및 AppKit 프레임 워크 ( GitHub의 전체 소스 및 Xcode 프로젝트 )를 사용합니다.

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

툴바에 사용 된 아이콘은 Tango Desktop Project 의 아이콘 입니다.


1
맥 OSX에서 그것을 여는 방법?
john Smith

1
마우스에는 적합하지만 10.10에서 키 누름을 캡처하지 않습니다 :(
Mecki

@Mecki 나는 그것을 알아 차렸을 때 repo 설명에 이것을 추가했습니다. 불행히도 왜 범용 액세스 API에 대한 앱별 액세스 제한 및 바이너리가 서명되지 않았는지 알 수 없습니다. 또는 그들은 심지어 이것을 완전히 죽였습니다.
Daniel Beck

Mac OS X 10.9.5에서는 마우스에 적합하지만 키 누름도 캡처하지 않습니다. 그 이유를 알아 냈니, Mecki? 감사.
Jiakuan W

@JiakuanW이 문제를 해결한다고 주장하는 GitHub 저장소에 PR이 있습니다.
Daniel Beck


2

Typingstats 는 총 키 입력 수 및 기타 다양한 메트릭을 표시합니다. 포인팅 장치 클릭 수는 계산하지 않습니다.


직접 해보셨습니까? 실제로 가지고 있거나 항상 미국에 따라 키보드 레이아웃을 변경합니까?
Daniel Beck

캐나다 및 기타 지역에서는 사용할 수없는 App Store 앱입니다.
저스틴

1

클릭 및 버튼 누름 카운터 프로그램은 마우스 및 키보드 클릭 이벤트를 수신하고 계산할 수있는 Cocoa Objective-C 프로그램을 작성하여 가능합니다.

살펴볼 클래스는 NSEvent입니다. 특히 addGlobalMonitorForEventsMatchingMask : handler : 클래스 메소드는 매우 유용합니다. 다음과 같은 이벤트를 모니터링하도록 제공하기 때문에 :

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown


3
실제로 사용자를 목표에 더 가깝게 만드는 방법으로 답변을 시도하십시오. 프로그래밍을 배우라고 말하는 것은 아닙니다. 예를 들어 실제 솔루션의 요지 인 관련 코드 스 니펫 또는 함수 호출을 제공 할 수 있습니다. 여전히 모든 사람에게 유용하지는 않지만 다른 사람들이 작업 솔루션을 제공하기위한 기초로 사용될 수 있습니다.
Daniel Beck

은 "내게는 코코아에 대한 가이드 라인을 프로그래밍"을 사용하여 제안 할 때 더 읽기 내가 일을 할 것입니다 그것을 것 같다 NSEvent 클래스, ... 지적 된 후에 내가 잘못된 접근 방식을 복용 것처럼 좋은 전화 다니엘 벡 보인다
MrDaniel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.