Botão do mouse e contador de teclas para Mac OS X


8

Existem técnicas para Linux e Windows , mas existe uma maneira de contar eventos de mouse e teclado no Mac OS X? Estou interessado em fazer uma análise estatística da minha atividade diária.

Respostas:


15

Com base na inspiração de MrDaniel , decidi programar um pequeno contador simples.

Captura de tela da janela principal

O código-fonte para isso, menos a interface do usuário definida como xib; usa as estruturas Foundation e AppKit (fontes completas e projeto Xcode no 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

Os ícones usados ​​na barra de ferramentas são do Tango Desktop Project .


11
como abri-lo no mac osx?
— John Smith

11
Funciona bem para o mouse, mas não captura as teclas pressionadas em 10.10 :(
— Mecki

@Mecki Adicionei isso à descrição do repositório há um tempo atrás quando notei. Infelizmente, não tenho idéia do motivo, possivelmente relacionado a restrições de acesso por aplicativo à API de acesso universal e ao binário não assinado. Ou eles até mataram isso completamente.
— Daniel Beck

No Mac OS X 10.9.5, ele funciona bem para o mouse, mas também não captura as teclas pressionadas. Você já descobriu o motivo, Mecki? Obrigado.
— Jiakuan W

@JiakuanW Eu recebi um PR há algum tempo no repositório GitHub que afirma resolver este problema (não testado).
— Daniel Beck


2

Typingstats exibe um número total de pressionamentos de tecla e várias outras métricas. Porém, não conta cliques em dispositivos apontadores.


Você já experimentou? Isso muda o layout do teclado com base no que você realmente tem ou é sempre nos EUA?
— Daniel Beck

App Store App, não disponível no Canadá e possivelmente em outros lugares.
— Justin

1

Um programa de contador de clique e botão é possível através da gravação de um programa Cocoa Objective-C que pode receber e contar eventos de clique de mouse e teclado.

A classe a ser examinada é o NSEvent, especificamente, o método addGlobalMonitorForEventsMatchingMask: handler: class deve ser muito útil. Desde que oferece monitorar eventos como:

NSLeftMouseUp

NSRightMouseUp

NSOtherMouseUp

NSLeftMouseDown

NSRightMouseDown

NSOtherMouseDown

NSKeyDown


3
Tente responder de uma maneira que realmente aproxime o usuário de seu objetivo. Apenas dizer a ele para aprender programação não. Você pode, por exemplo, fornecer trechos de código relevantes ou chamadas de função, a essência de uma solução real. Embora ainda não seja útil para todos, ele pode ser usado como base por outros para fornecer uma solução funcional.
— Daniel Beck

Boa decisão Daniel Beck parece que eu estava adotando a abordagem errada ao sugerir o uso das "Diretrizes de programação de acessibilidade para cacau", depois de ler mais, fui apontado para a classe NSEvent, que parece que fará o trabalho ...
— MrDaniel
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.