2012-05-22 49 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上運行。 –