2011-09-01 26 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))。

相關問題