0
有沒有辦法檢測鼠標是否已經在X服務器上任何地方移動或發生過鍵盤事件?我需要對用戶在X11輸入設備上做任何事情做出反應。X11:檢測一般鼠標和鍵盤事件
我只設法使用GTK在我自己的窗口上檢測事件。
我感謝每一個信息(它不必是完整的代碼,切入點將是一件好事夠了!)
有沒有辦法檢測鼠標是否已經在X服務器上任何地方移動或發生過鍵盤事件?我需要對用戶在X11輸入設備上做任何事情做出反應。X11:檢測一般鼠標和鍵盤事件
我只設法使用GTK在我自己的窗口上檢測事件。
我感謝每一個信息(它不必是完整的代碼,切入點將是一件好事夠了!)
是的,你可以使用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);
在你的事件隊列,你現在可以尋找相應的事件。
哇,非常感謝!有沒有辦法讓設備產生輸入?'例如,當我只想攔截由XTEST創建的設備時? – Nidhoegger
@Nidhoegger使用'XGetEventData'從事件中獲取數據並讀取這些數據的擴展說明。我會假設你得到的信息(deviceid),是的,但沒有看過它。我上面提到的工具unclutter-xfixes可以告訴你如何識別隊列中的事件以及如何調用'XGetEventData'。之後不要忘記也調用'XFreeEventData'。 –