2

カスタム キーボード イベントを処理するのに苦労しています。command、alt、ctrl、shift などの kCGEventFlagMasks の有無にかかわらず、任意のキーを送信できるようにしたい...

たとえば、現在の最前面のアプリを送信したい場合、フォント ウィンドウを表示する必要があるキー コンボ cmd+t の TextEdit であると仮定します。

ただし、現在、TextEdit の現在のドキュメントに追加されるのは t だけです。カスタム セット CGEventFlags を使用してイベントを投稿し、代わりに t イベントの周りに cmd の keyDown イベントと keyUp イベントを生成しようとしました。無料アプリのキー コードは、CGEventFlags セットを使用すると、cmd + t が押されたことを示していますが、このキーの組み合わせは TextEdit に渡されず、単一の t...

これが私のコードです:

...
flags = (flags | kCGEventFlagMaskCommand);
[self writeString:@"" withFlags:flags];
...

(void)writeString:(NSString *)valueToSet withFlags:(int)flags
{
UniChar buffer;
CGEventRef keyEventDown = CGEventCreateKeyboardEvent(NULL, 1, true);
CGEventRef keyEventUp = CGEventCreateKeyboardEvent(NULL, 1, false);
CGEventSetFlags(keyEventDown,0);                
CGEventSetFlags(keyEventUp,0);          
for (int i = 0; i < [valueToSet length]; i++) {
    [valueToSet getCharacters:&buffer range:NSMakeRange(i, 1)];
    CGEventKeyboardSetUnicodeString(keyEventDown, 1, &buffer);
    CGEventSetFlags(keyEventDown,flags);
    CGEventPost(kCGSessionEventTap, keyEventDown);
    CGEventKeyboardSetUnicodeString(keyEventUp, 1, &buffer);
    CGEventSetFlags(keyEventUp,flags);
    CGEventPost(kCGSessionEventTap, keyEventUp);

}
CFRelease(keyEventUp);
CFRelease(keyEventDown);

}

また、CGEventTapLocation の意味を理解するのに苦労しています。どのイベント タップが自分のタスクに最も適しているかわかりません。Quartz Event Reference の説明は私を啓発しません:

kCGHIDEventTap
Specifies that an event tap is placed at the point where HID system events enter the window server.


kCGSessionEventTap
Specifies that an event tap is placed at the point where HID system and remote control events enter a login session.


kCGAnnotatedSessionEventTap
Specifies that an event tap is placed at the point where session events have been annotated to flow to an application.

そのトピックに関する多くの投稿を見てきましたが、どれも私の問題を解決するのに役立ちませんでした...助けてくれてありがとう!

4

1 に答える 1

3

それは質問に対する答えではありませんが、AppleScript による現在の回避策です。

appleScriptString = [NSString stringWithFormat:@"tell application \"System Events\" to key code %d using %@",keyCode, modifierDownString];

私はその機能にフィードします:

- (void)runScript:(NSString*)scriptText
{
    NSDictionary *error = nil;
    NSAppleEventDescriptor *appleEventDescriptor;
    NSAppleScript *appleScript;

    appleScript = [[NSAppleScript alloc] initWithSource:scriptText];
    appleEventDescriptor = [appleScript executeAndReturnError:&error];

    [appleScript release];
}
于 2011-10-17T14:39:06.187 に答える