[英]Linux x11 XGrabKeyboard() cause keyboard to be frozen
我正在編寫一個需要監聽用戶鍵盤的程序。
我使用函數XGrabKeyboard(),這是我的代碼:
XGrabKeyboard(pDisplay, DefaultRootWindow(pDisplay), True, GrabModeAsync, GrabModeAsync, CurrentTime);
XEvent event;
while (true)
{
XNextEvent(pDisplay, &event);
switch (event.type)
{
...
}
}
但它會導致鍵盤和光標被凍結。
我查看了手冊頁,它只說:“第三個參數指定一個布爾值,指示是否像往常一樣報告鍵盤事件。”
我嘗試了true或false或第3個參數,GrabModeAsync和GrabModeSync用於第4和第5個參數,但它不起作用。
調用XGrabKeyboard()后,鍵盤被凍結,鼠標單擊不響應。
有任何想法嗎?
XGrabKeyboard()(如果成功 - 請務必檢查返回值),將所有關鍵事件重定向到您的客戶端。
因此,如果while(true)內的“...”沒有正確處理這些鍵事件,或者沒有ungrab(XUngrabKeyboard)或釋放同步事件(XAllowEvents,僅適用於GrabModeSync),那么鍵盤似乎會鎖定起來。
boolean參數是owner_events,它指示是否始終向提供給XGrabKeyboard的窗口報告鍵事件,或者將它們報告給它們通常在沒有抓取的情況下進入的窗口。 通常,您需要False(報告到抓取窗口)。
對於XGrabKeyboard的典型用法(我不知道你的用例),你想要的參數是:
但是,這取決於。 為了給出任何確定的答案,您可能需要發布一個可編譯的程序,我認為該錯誤很可能出現在代碼的“...”部分。 嘗試將您的應用縮小到可能由其他人運行的單個文件測試用例。 或者解釋一下為什么你要抓住你想要在大局中完成什么。
我無法幫助XGrabKeyboard功能 - 我之前沒有使用它,也不知道它是如何工作的 - 但我可以建議另一種獲取鍵盤事件的方法。
使用XCreateWindow創建窗口時,最后一個參數是XSetWindowAttributes對象。 此對象具有成員event_mask,您可以使用該成員選擇窗口將接收的事件。
我這樣設置我的:
XSetWindowAttributes setWindAttrs
setWindAttrs.event_mask = ExposureMask
| KeyPressMask
| KeyReleaseMask
| ButtonPressMask
| ButtonReleaseMask;
這意味着如果在創建窗口時將此對象傳遞給XCreateWindow,則會收到鍵盤按鍵和鼠標按鍵單擊的事件。
另外另一個注意事項是你可以使用XPending(pDisplay)
檢查是否還有等待處理的事件 - 所以它可以在你的while(true)
行中替換為true
。
編輯:你的凍結問題也可能是你在while循環中的任何地方都沒有返回false? 它可能會被卡在無限循環中,除非你剛剛為帖子刪除了那個位。 嘗試用上面提到的xpending替換true,它可以解決問題,或者只是在處理事件后返回false,但這只會處理每幀一個事件,而不是像XPending那樣處理所有當前掛起的事件,我假設這就是你想要做的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.