簡體   English   中英

Linux x11 XGrabKeyboard()導致鍵盤被凍結

[英]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的典型用法(我不知道你的用例),你想要的參數是:

  • 抓取窗口=您的應用中與抓取原因相關的一些窗口
  • owner_events = False將所有事件發送到該窗口
  • pointer_mode =不同於指針的Async
  • keyboard_mode = Async只是重定向所有鍵事件,避免需要AllowEvents
  • time =事件觸發抓取的時間戳,理想情況下,或者通過更改屬性並從PropertyNotify獲取時間戳生成的時間戳

但是,這取決於。 為了給出任何確定的答案,您可能需要發布一個可編譯的程序,我認為該錯誤很可能出現在代碼的“...”部分。 嘗試將您的應用縮小到可能由其他人運行的單個文件測試用例。 或者解釋一下為什么你要抓住你想要在大局中完成什么。

我無法幫助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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM