2011-09-01 92 views
3

有没有人有幸在OS X上用CGEventCreateKeyboardEvent模拟Caps Lock keystroke?基本上我已尝试字母字符和字母数字字符好,但大写锁定。希望我想模拟大写锁定按键来打开/关闭LED。我不知道我的测试代码有什么问题。有没有人有过这样的经历?如何在OS X中使用CGEventCreateKeyboardEvent来模拟大写锁定击键操作

#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 
+0

与此相同,http://stackoverflow.com/q/2334022/236738 – MacGeek

回答

1

你需要真正切换大写锁定状态,或仅仅是打开LED开/关是否足够?如果它仅仅是LED的,有一些示例代码:

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

注意,它不涉及CGEvent在所有 - 它使用由于IOKit魔法乱用键盘直接的LED。

+1

基本上我希望我可以改变大写锁定状态并将LED打开/关闭在一起。我试过你的示例代码。但是我发现了一个问题。它只是在应用程序中调用此示例代码的vaild。当我更改为其他应用程序时,大写字母锁定LED会与键盘输入异步。希望我想知道是否有任何方式在osx中​​实现这一点。无论如何,感谢您提前回答。 –

0

哈哈!这可能只是一个典型的例子..你的代码退出是因为它真的能够做任何事情。在这里和那里添加一些sleep(seconds)。还可以尝试在延迟和延迟事件之间放置一个小延迟(usleep(microseconds))。

相关问题