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.

Jashank Jeremy
fonte

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 .

Daniel Beck
fonte
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
4

O WhatPulse é executado no Windows, OS X e Linux.

Agradecemos a Vsauce por apontar esta questão.

Iszi
fonte
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.

Lri
fonte
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

MrDaniel
fonte
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