0

(この質問は、現在のイベントを変更する代わりに、CGEventPostを使用してより多くのキーストロークをシミュレートしていることを除いて、最近ここに投稿した質問と似ています)

以下のコードは、「h」ボタンが押されるたびに「a」文字を挿入することができ、すべてのアプリケーションで正常に機能しました。

CGEventRef KeyHandler(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
    UniCharCount actualStringLength;
    UniCharCount maxStringLength = 1;   
    UniChar chars[3];

    CGEventKeyboardGetUnicodeString(event, maxStringLength, &actualStringLength, chars);

    if (chars[0] == 'h') {

        CGEventRef keyEventDown = CGEventCreateKeyboardEvent( NULL, 1, true);
        CGEventRef keyEventUp = CGEventCreateKeyboardEvent( NULL, 1, false);

        chars[0] = 'a';
        CGEventKeyboardSetUnicodeString(keyEventDown, 1, chars);
        CGEventKeyboardSetUnicodeString(keyEventUp, 1, chars);
        CGEventSetIntegerValueField(keyEventDown, kCGKeyboardEventKeycode, 0); // 0 is key code of 'a' button
        CGEventSetIntegerValueField(keyEventUp, kCGKeyboardEventKeycode, 0);

        CGEventPost(kCGSessionEventTap, keyEventDown);
        CGEventPost(kCGSessionEventTap, keyEventUp);
        return NULL;
    }

    return event;
}

'a'をバックスペース文字に置き換えると、一部のアプリケーション(Mac上のMicrosoft Excelなど)はそれを認識しなくなります。理由はわかりますか?

CGEventRef KeyHandler(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
    UniCharCount actualStringLength;
    UniCharCount maxStringLength = 1;   
    UniChar chars[3];

    CGEventKeyboardGetUnicodeString(event, maxStringLength, &actualStringLength, chars);

    if (chars[0] == 'h') {

        CGEventRef keyEventDown = CGEventCreateKeyboardEvent( NULL, 1, true);
        CGEventRef keyEventUp = CGEventCreateKeyboardEvent( NULL, 1, false);

        chars[0] = '\b';
        CGEventKeyboardSetUnicodeString(keyEventDown, 1, chars);
        CGEventKeyboardSetUnicodeString(keyEventUp, 1, chars);
        CGEventSetIntegerValueField(keyEventDown, kCGKeyboardEventKeycode, 51);
        CGEventSetIntegerValueField(keyEventUp, kCGKeyboardEventKeycode, 51);

        CGEventPost(kCGSessionEventTap, keyEventDown);
        CGEventPost(kCGSessionEventTap, keyEventUp);
        return NULL;       
    }

    return event;
}
4

2 に答える 2

1

理解した。イベントの Unicode 文字列を設定するコードを削除すると、すべて正常に動作します。

chars[0] = '\b';
CGEventKeyboardSetUnicodeString(keyEventDown, 1, chars);
CGEventKeyboardSetUnicodeString(keyEventUp, 1, chars);

ただし、Mac OS の一部の特定のアプリケーションでこれが発生する理由はわかりません。

于 2012-06-05T05:43:00.830 に答える
0

「\b」エスケープ シーケンスは ASCII 0x08 を生成します。私のテストでは、削除 (バックスペース) キーを押したときに生成されるイベントは ASCII 0x7f です。

一般に、これはイベントをシミュレートする方法を理解するために使用する明白な手法のようです。イベントをキャプチャして詳細をダンプするツールを使用して、そのイベントを実行します。

于 2012-05-28T08:35:57.643 に答える