MyTetra Share
Делитесь знаниями!
Как отлавливать клавиатурные события в MacOs
Время создания: 26.09.2011 18:59
Раздел: Компьютер - MacOs - Готовые решения
Запись: xintrea/mytetra_syncro/master/base/1317049144ls92fh1vcn/text.html на raw.github.com

Вопрос: Для утилиты сценариев я должен иметь возможность записать серию события клавиатуры и мыши, которые происходят, когда приложение находится в фокусе.Вторая часть является возможность отправить позже эти события для активного окна.

Мне не нужно беспокоиться о меню и отслеживания идентификатор, какое окно получает вход.

Я знаю, как это сделать под Windows, но понятия не имеют о Mac OS X.

Ответ: Первое, что я скажу вам, что вы не можете сделать это, не позволяет пользователю поддержку 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);

}

}

Here is an example of the callback method i am using:

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);

}

 
MyTetra Share v.0.59
Яндекс индекс цитирования