2016-11-11 163 views
3

我正在嘗試編寫類似於Mac ID的應用程序,但有一些不同的選項。如何在Mac OS上模擬C++中的鍵入/按鍵?

據我所看到的所有類似的應用程序那裏存儲在密鑰鏈中的密碼,只需在登錄屏幕上的密碼字段中鍵入它。

這是我基於Apple docsRobot書面原代碼:

#include <ApplicationServices/ApplicationServices.h> 

void Press(int key); 
void Release(int key); 
void Click(int key); 

int main() { 
    Press(56); 
    Click(6); 
    Release(56); 
} 

void Press(int key) { 
    // Create an HID hardware event source 
    CGEventSourceRef src = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); 

    // Create a new keyboard key press event 
    CGEventRef evt = CGEventCreateKeyboardEvent(src, (CGKeyCode) key, true); 

    // Post keyboard event and release 
    CGEventPost (kCGHIDEventTap, evt); 
    CFRelease (evt); CFRelease (src); 

    usleep(60); 
} 

void Release(int key) { 
    // Create an HID hardware event source 
    CGEventSourceRef src = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); 

    // Create a new keyboard key release event 
    CGEventRef evt = CGEventCreateKeyboardEvent(src, (CGKeyCode) key, false); 

    // Post keyboard event and release 
    CGEventPost (kCGHIDEventTap, evt); 
    CFRelease (evt); CFRelease (src); 

    usleep(60); 
} 

void Click(int key) { 
    Press(key); 
    Release(key); 
} 

它應該輸出一個「Z」,但它輸出一個「z」。根據文檔修改鍵也必須「按下」。

它有什麼問題?

然後谷歌搜索一天後,我發現this SO似乎解決了我的SHIFT問題的答案(雖然我不是100%關於此解決方案的正確性),但我似乎無法輸出像「 ÁÉÍÓÜÖ」。

我該怎麼做?首先可能嗎?

我知道這已經不止一個問題了,但我仍然試圖解決同樣的問題,至今我找不到一個完美的解決方案,所以我想這對其他人來說是很好的解決方案。

非常感謝您提前,任何幫助表示讚賞。

回答

1

它可能獲得任何你想要的字符。你幾乎走在正確的道路上。 我想你只需要指定你感興趣的Unicode字符。 因此,如果你發送unicode並使用kVK_Space作爲鍵碼,你應該有你需要的東西,並且在發佈事件之前你可以調用下面的代碼對象

if (unicode){ 
unichar str[2] = {0}; 
str[0] = (unichar)unicode; 
memcpy(str, &unicode, 4); 
CGEventKeyboardSetUnicodeString(theEvent, 1, str); 
} 
+0

雖然我給了這個答案的賞金,但它並沒有真正有用它的當前形式。什麼是unicode這裏?我嘗試使用'const char * unicode =「Á」;',但它不起作用。 –

+0

unicode變量將是您想要打印的任何字符的整數(以上示例爲uint16_t),在您的情況下爲「Á」。 – MacGeek