2016-05-19 122 views
0

有沒有辦法檢測鼠標是否已經在X服務器上任何地方移動或發生過鍵盤事件?我需要對用戶在X11輸入設備上做任何事情做出反應。X11:檢測一般鼠標和鍵盤事件

我只設法使用GTK在我自己的窗口上檢測事件。

我感謝每一個信息(它不必是完整的代碼,切入點將是一件好事夠了!)

回答

1

是的,你可以使用Xinput2擴展做到這一點。一個完整但相當小的工具可以爲光標事件做到這一點,可以在here (unclutter-xfixes)找到。作爲免責聲明,我是該工具的作者。

教程形式的另一個很好的資源可以找到here

使用XInput2有多方面的好處:

  • 無需不斷查詢位置(資源節約型)
  • 不能與/斷應用,如在將所有窗口選擇鼠標事件的干擾。

什麼你做使用容易不Xinput2得到是確切位置(但是當你需要它,你可以查詢),但我的理解是,你不需要也無妨。

一旦你加載的擴展,我不會在這裏顯示,您可以選擇這樣的所有事件:

XIEventMask masks[1]; 
unsigned char mask[(XI_LASTEVENT + 7)/8]; 

memset(mask, 0, sizeof(mask)); 
XISetMask(mask, XI_RawMotion); 
XISetMask(mask, XI_RawButtonPress); 
XISetMask(mask, XI_RawKeyPress); 

masks[0].deviceid = XIAllMasterDevices; 
masks[0].mask_len = sizeof(mask); 
masks[0].mask = mask; 

XISelectEvents(display, DefaultRootWindow(display), masks, 1); 
XFlush(display); 

在你的事件隊列,你現在可以尋找相應的事件。

+0

哇,非常感謝!有沒有辦法讓設備產生輸入?'例如,當我只想攔截由XTEST創建的設備時? – Nidhoegger

+0

@Nidhoegger使用'XGetEventData'從事件中獲取數據並讀取這些數據的擴展說明。我會假設你得到的信息(deviceid),是的,但沒有看過它。我上面提到的工具unclutter-xfixes可以告訴你如何識別隊列中的事件以及如何調用'XGetEventData'。之後不要忘記也調用'XFreeEventData'。 –