(この質問は、現在のイベントを変更する代わりに、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;
}