2011-09-01 4 views
3

OS X에서 CGEventCreateKeyboardEvent로 Caps Lock 키 스트로크를 시뮬레이션 한 사람이 있습니까? 기본적으로 알파벳 문자와 영숫자 문자를 사용해 보았지만 Caps Lock은 괜찮습니다. 다행히도, Caps Lock 키 스트로크를 시뮬레이트하여 LED를 켜고 끌 수 있습니다. 테스트 코드에 어떤 문제가 있는지 알 수 없습니다. 아무도 이것을 경험하지 못했습니까? 명령 아래에OS X에서 CGEventCreateKeyboardEvent로 Caps Lock 키 입력을 시뮬레이트하는 방법

#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를의 경우에 몇 가지 예제 코드가있다 : 전혀 CGEvent을 포함하지 않는

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

주 -이 직접 키보드 LED가 엉망 IOKit 마법을 사용합니다.

+1

기본적으로 caps lock 상태를 변경하고 LED를 켜고 끌 수 있기를 바랍니다. 나는 당신의 샘플 코드를 시도했다. 하지만 한 가지 문제를 발견했습니다. 이 샘플 코드를 호출하는 애플리케이션에서만 유효합니다. 다른 응용 프로그램으로 변경하면 Caps Lock LED가 키보드 입력과 비동기 적으로됩니다. 다행히도 osx에서 이것을 구현할 방법이 있는지 알고 싶습니다. 어쨌든, 미리 답변 해 주셔서 감사합니다. –

0

하하! 이건 그냥 고전일지도 몰라. 정말로 아무것도 할 수 없기 때문에 코드가 종료된다. sleep(seconds)을 여기 저기에 추가하십시오. 또한 다운 이벤트와 업 이벤트 사이에 작은 지연 (usleep(microseconds))을 넣으십시오.

관련 문제