2012-05-22 6 views
1

OSX에서 C++에서 ApplicationServices 및 CGEventPost를 사용하고 있는데 키를 눌렀을 지 알 수 없지만 작동하지 않습니다.OSX에서 C++의 CGEventPost를 사용하여 키를 누른 상태로 유지하려면 어떻게해야합니까?

void postKeyboardEvent(int keyCode, bool keyUp = false) 
{ 

    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); 

    CGEventRef keyEvent = CGEventCreateKeyboardEvent(source, (CGKeyCode) keyCode, !keyUp); 
    CGEventPost(kCGAnnotatedSessionEventTap, keyEvent); 
    CFRelease(keyEvent); 

    CFRelease(source); 

} 

이 내가 그것을 테스트입니다 방법은 다음과 같습니다 : 여기

은 내가 사용하는 방법입니다 내 이해함으로써

postKeyboardEvent(kVK_Command); 
postKeyboardEvent(kVK_Tab); 
postKeyboardEvent(kVK_Tab, true); 
postKeyboardEvent(kVK_Command, true); 

이 다른 창에 저를 전환해야하지만, 대신 그냥 " "Command 키를 놓고 Tab 문자를 입력하십시오. 중요

: 나는 같은 것을 사용하지 않으려는 다음

CGEventSetFlags(keyEvent, kCGEventFlagMaskCommand); 

내가가 필요없이 키 다운과 키 업의 "직렬 체인"명령 을 보낼 필요가있다 어떤 키 코드가 수정 자 키인지 알 수 있으며 얼마나 많은 이벤트를 플래그 할 지 알 수 있습니다.

이 방법이 있습니까?

답변

1

답변입니다.

CGEventFlags flags = kCGEventFlagMaskShift; 
CGEventRef ev; 
CGEventSourceRef source = CGEventSourceCreate (kCGEventSourceStateCombinedSessionState); 

//press down    
ev = CGEventCreateKeyboardEvent (source, keyCode, true);  
CGEventSetFlags(ev,flags | CGEventGetFlags(ev)); //combine flags       
CGEventPost(kCGHIDEventTap,ev); 
CFRelease(ev);    

//press up         
ev = CGEventCreateKeyboardEvent (source, keyCode, false);      
CGEventSetFlags(ev,flags | CGEventGetFlags(ev)); //combine flags       
CGEventPost(kCGHIDEventTap,ev); 
CFRelease(ev);    

CFRelease(source); 

UPDATE : https://stackoverflow.com/a/8202467/877860https://stackoverflow.com/users/314546/valexa

에 의해 게시이를위한 가장 간단한 방법은 예를 들어 원하는 수정 (들)의 플래그와 함께 현재의 수정을 플래그를 OR 처리 비트 단위입니다 : 이것은 내가 착륙 한 방법입니다. 일부 정리를 사용할 수는 있지만 키 코드 시퀀스를 시스템에 보내고 예측할 수있게하는 데 꽤 효과적입니다.

여기에서 매우 중요한 요소는 시프트 키가 꺼져 있지 않은 경우 (& ~) 의미 AND NOT을 사용하여 시프트 키 마스크를 제거하는 비트 연산입니다.

int shiftKeyCode = 56; 
bool shiftIsDown = false; 

void postKeyboardEvent(int keyCode, bool keyUp = false) 
{ 

    // Don't send keys while blocked. 
    if(blockState == 1){ 

     return; 

    } 

    if(keyCode == shiftKeyCode){ 

     if(keyUp){ 

      shiftIsDown = false; 

     }else{ 

      shiftIsDown = true; 

     } 

    } 

    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); 
    CGEventRef keyEvent = CGEventCreateKeyboardEvent(source, (CGKeyCode) keyCode, !keyUp); 

    if(shiftIsDown){ 

     // Use Shift flag 
     CGEventSetFlags(keyEvent, CGEventGetFlags(keyEvent) | kCGEventFlagMaskShift); 

    }else{ 

     // Use all existing flag except Shift 
     CGEventSetFlags(keyEvent, CGEventGetFlags(keyEvent) & ~kCGEventFlagMaskShift); 

    } 

    CGEventPost(kCGHIDEventTap, keyEvent); 

    CFRelease(keyEvent); 
    CFRelease(source); 

} 
+0

코드를 사용해 보셨습니까? 작동하지 않습니다 – user2159978

+0

이것은 오래된 것입니다, 애플은 일을 바꿨을 수도 있습니다. 나는이 작업을 오래 동안하지 않았으므로 최신 OSX에서 작동하는지 모르겠습니다. –

관련 문제