3

OS X で CGEventCreateKeyboardEvent を使用して Caps Lock キーストロークをシミュレートした人はいますか? 基本的に英字と英数字はOKですがCaps Lockでやってみました。うまくいけば、Caps Lock キーストロークをシミュレートして LED のオン/オフを切り替えたいと思います。テスト コードの何が問題なのかわかりません。誰もこれを経験したことがありますか?

#include <stdio.h>
#include <ApplicationServices/ApplicationServices.h>

main()
{
    bool wasCapsLockDown = CGEventSourceKeyState(kCGEventSourceStateHIDSystemState, 57);
    if (wasCapsLockDown)
        printf("On\n");
    else
        printf("Off\n");
    ProcessSerialNumber psn;
    GetFrontProcess(&psn);
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);//CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
    CGEventRef CapsLockDown = CGEventCreateKeyboardEvent(source, (CGKeyCode)57, true);
    //CGEventFlags modifiers = 0;
    //modifiers |= kCGEventFlagMaskAlphaShift;
    //CGEventSetFlags(CapsLockDown, modifiers);
    CGEventRef CapsLockUp = CGEventCreateKeyboardEvent(source, (CGKeyCode)57, false);

    // simulate capslock down
    CGEventPost(kCGHIDEventTap, CapsLockDown);
    // simulate capslock up
    CGEventPost(kCGHIDEventTap, CapsLockUp);

    //CGEventPost(kCGAnnotatedSessionEventTap, CapsLockDown); /* doesn't work */
    //CGEventPost(kCGAnnotatedSessionEventTap, CapsLockUp);

    //CGEventPost(kCGSessionEventTap, CapsLockDown); /* doesn't work */
    //CGEventPost(kCGSessionEventTap, CapsLockUp);

    //CGEventPostToPSN(&psn, CapsLockDown); /* doesn't work */
    //CGEventPostToPSN(&psn, CapsLockUp);

    CFRelease(CapsLockUp);
    CFRelease(CapsLockDown);
    CFRelease(source);
}

以下のコマンドでコンパイル

    gcc test.c -framework ApplicationServices
4

2 に答える 2

1

Caps Lock の状態を実際に切り替える必要がありますか、それとも単に LED のオン/オフを切り替えるだけで十分ですか? LED だけの場合は、次の場所にサンプル コードがあります。

https://github.com/mikeash/mikeash.com-svn/blob/master/CPUFlash/keyboard_leds.c

CGEvent はまったく関与していないことに注意してください。IOKit マジックを使用して、キーボードの LED を直接いじっています。

于 2011-09-01T03:59:52.593 に答える
0

ハハ!これは単なる古典かもしれません..あなたのコードは本当に何でもできるので終了します。sleep(seconds)あちこちにを追加します。usleep(microseconds)また、ダウン イベントとアップ イベントの間に小さな遅延 ( ) を入れてみてください。

于 2016-03-20T14:05:06.610 に答える