2012-02-23 32 views
4

我嘗試發送鍵與XLIB和XTestFakeKeyEvent的應用程序,它做工精細,用下面的代碼:XLIB,XTestFakeKeyEvent latences

XSetInputFocus(disp, list[selectWindow],RevertToPointerRoot,CurrentTime); 
for(i=0;i<hello.size();i++){ 
    tamper[0] = hello[i]; 
    KeySym key = XStringToKeysym(tamper); 
    XTestFakeKeyEvent(disp,XKeysymToKeycode(disp, key),True, CurrentTime); 
    XTestFakeKeyEvent(disp,XKeysymToKeycode(disp, key),False, CurrentTime); 
} 

如果選擇列表[selectWindow]是我發送數據的窗口,並篡改一個char [2](將char從hello [i]轉換爲char *作爲函數 此代碼將hello wariable的內容寫入選定窗口,但是,我試圖發送Return鍵,

XSetInputFocus(disp, list[selectWindow],RevertToPointerRoot,CurrentTime); 
XTestFakeKeyEvent(disp,XKeysymToKeycode(disp, XK_Return),True, CurrentTime); 
XTestFakeKeyEvent(disp,XKeysymToKeycode(disp, XK_Return),False, CurrentTime); 

所以我再次選擇窗口,併發送X K_Return是應用程序的關鍵,但它不起作用,我認爲這是因爲Xlib存在'延遲',因爲如果我在'for'循環結尾處等待(2),它可以正常工作,但每次發送消息時,我都不想在2秒內等待。

我不知道我該怎麼做才能解決這個問題。

謝謝。

+0

我有這個完全相同的問題。我找到了兩種解決方法。首先,發送後等待。我發現我可以等待不到2秒鐘。使用它只需十分之一秒的等待。其次,如果我發送兩份(或更多)退貨,除第一份正常工作外(沒有「睡眠」)。 – MPT 2012-03-30 15:22:01

+0

@MPT,你甚至可以使用'nanosleep()' – 2015-01-23 13:29:55

回答

1

XFlush(disp)或XSync(disp,false)在調用XTestFakeKeyEvent後?

+0

這些(也不是兩者)都不能解決這個問題。 – MPT 2012-03-30 15:22:55

+0

'XFlush'修復了'XTestFakeKeyEvent'後的問題!這讓我瘋狂,我完全錯過了這一點。感謝pzan! – Noitidart 2017-02-22 20:20:43