2012-05-22 130 views
1

我在OSX上的C++中使用ApplicationServices和CGEventPost,并试图查看是否可以按住某个键但它不工作。如何在OSX上使用C++在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

这就是答案!发表https://stackoverflow.com/users/314546/valexa

https://stackoverflow.com/a/8202467/877860这个最简单的方法是只比特OR当前修改成你想要的改性剂,如旗 标志:

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 : 这是我登陆的方法,它可以使用一些清理工作,但对于我为系统分派一系列键码并使它们可预测发生的目的而言,它工作得非常好。

这里一个非常重要的元素是按位操作,如果移位未关闭,则使用(& ~)表示AND NOT来移除shift键掩码。

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上运行。 –