有没有人在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
答案 0 :(得分:1)
您是否需要实际切换大写锁定状态,或仅仅打开/关闭LED?如果它只是LED,那么有一些示例代码:
https://github.com/mikeash/mikeash.com-svn/blob/master/CPUFlash/keyboard_leds.c
请注意,它根本不涉及CGEvent - 它使用IOKit魔法直接搞乱键盘LED。
答案 1 :(得分:0)
哈哈!这可能只是一个经典..你的代码退出是因为它真的能够做任何事情。在这里和那里添加一些sleep(seconds)
。同时尝试在向下和向上事件之间加一小延迟(usleep(microseconds)
)。