3

有没有人在 OS X 上使用 CGEventCreateKeyboardEvent 模拟 Caps Lock 击键?基本上我已经尝试过字母字符和字母数字字符,但是 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

您是否需要实际切换大写锁定状态,或者仅仅打开/关闭 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)在这里和那里添加一些。还可以尝试在 down 和 up 事件之间放置一个小的延迟 ( usleep(microseconds))。

于 2016-03-20T14:05:06.610 回答