对于脚本实用程序,我需要能够记录应用程序具有焦点时发生的一系列键盘和鼠标事件.第二部分是以后能够将这些事件发送到活动窗口.
我不需要担心菜单或跟踪哪个窗口接收输入的标识符.
我知道如何在Windows下执行此操作,但不知道Mac OS X.
的第一件事,我会告诉你的是,你CAN NOT未经用户允许在前往的交通控制面板assitive设备的支持,做到这一点.这是OSX内置的某种安全性.
这是我在我的一个应用程序中使用的代码snippit来执行此操作:
//this method calls a carbon method to attach a global event handler - (void)attachEventHandlers { //create our event type spec for the keyup EventTypeSpec eventType; eventType.eventClass = kEventClassKeyboard; eventType.eventKind = kEventRawKeyUp; //create a callback for our event to fire in EventHandlerUPP handlerFunction = NewEventHandlerUPP(globalKeyPress); //install the event handler OSStatus err = InstallEventHandler(GetEventMonitorTarget(), handlerFunction, 1, &eventType, self, NULL); //error checking if( err ) { //TODO: need an alert sheet here NSLog(@"Error registering keyboard handler...%d", err); } //create our event type spec for the mouse events EventTypeSpec eventTypeM; eventTypeM.eventClass = kEventClassMouse; eventTypeM.eventKind = kEventMouseUp; //create a callback for our event to fire in EventHandlerUPP handlerFunctionM = NewEventHandlerUPP(globalMousePress); //install the event handler OSStatus errM = InstallEventHandler(GetEventMonitorTarget(), handlerFunctionM, 1, &eventTypeM, self, NULL); //error checking if( errM ) { //TODO: need an alert sheet here NSLog(@"Error registering mouse handler...%d", err); } }
这是我正在使用的回调方法的示例:
OSStatus globalKeyPress(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) { NSEvent *anEvent = [NSEvent eventWithEventRef:theEvent]; NSEventType type = [anEvent type]; WarStrokerApplication *application = (WarStrokerApplication*)userData; //is it a key up event? if( type == NSKeyUp) { //which key is it? switch( [anEvent keyCode] ) { case NUMERIC_KEYPAD_PLUS: //this is the character we are using for our toggle //call the handler function [application toggleKeyPressed]; break; //Comment this line back in to figure out the keykode for a particular character default: NSLog(@"Keypressed: %d, **%@**", [anEvent keyCode], [anEvent characters]); break; } } return CallNextEventHandler(nextHandler, theEvent); }