Macos 如何在OS X中使用CGEventCreateKeyboardEvent模拟Caps Lock击键

Macos 如何在OS X中使用CGEventCreateKeyboardEvent模拟Caps Lock击键,macos,keyboard-events,capslock,Macos,Keyboard Events,Capslock,有没有人在OSX上用CGEventCreateKeyboardEvent模拟Caps Lock击键?基本上我试过字母字符和字母数字字符,但大写字母会锁定。希望我能模拟Caps Lock按键来打开/关闭LED。我不知道我的测试代码有什么问题。有人对此有经验吗 #include <stdio.h> #include <ApplicationServices/ApplicationServices.h> main() { bool wasCapsLockDown =

有没有人在OSX上用CGEventCreateKeyboardEvent模拟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);
}

您是否需要切换caps lock状态,或者仅仅打开/关闭LED就足够了?如果只是LED,则以下是一些示例代码:


请注意,它根本不涉及CGEvent——它使用IOKit魔术直接干扰键盘指示灯。

哈哈!这可能只是一个经典。。您的代码退出是因为它确实能够做任何事情。添加一些
睡眠(秒)
。另外,请尝试在向下和向上事件之间设置一个小延迟(
usleep(微秒)
)。

基本上,我希望可以更改caps lock状态并同时打开/关闭LED。我已经试过了你的示例代码。但我发现了一个问题。它仅在调用此示例代码的应用程序中可用。当我切换到其他应用程序时,caps lock LED将与键盘输入异步。希望我想知道是否有任何方法可以在osx中实现这一点。无论如何,提前感谢您的回答。与此相同,在MacOSX 10.11.6 El Capitan中不起作用,编译时会发出警告:“GetFrontProcess”已弃用,并正确报告Caps Lock状态,但无法切换。
    gcc test.c -framework ApplicationServices