2014-05-23 107 views
0

我知道這裏有一些,但許多答案總是有很多buts,ifs,而且你不應該那樣做。如何從X11監控鍵盤事件

我想要做的是有一個後臺程序,可以從X11監視鍵盤事件。這是在嵌入式設備上,它將有一個主要的應用程序,基本上運行在像Kiosk模式。我們想要一個後臺應用程序來管理一些事情,並且可能是後門掛鉤。但這個應用程序通常不會有重點。

我無法使用主應用程序,因爲如果主應用程序出現故障,或者要執行某些dev類型的功能以繞過主應用程序,它部分會出現故障保險。

我發現的最好的問題是幾歲,所以我不知道它是如何最新的。這對於Windows來說非常簡單。

X KeyPress/Release events capturing irrespective of Window in focus

+0

目前還不清楚,你想分配幾個「熱鍵」組合到後臺應用程序(其中的每一個會做一個特定的操作或將其聚焦)或者您是否需要能夠將長輸入輸入到後臺應用程序中,同時還能將相同的輸入傳遞給當前關注的任何內容?第一種情況可以通過使用XCB(xcb_grab_key)來實現,這是實現這些目標的常規方式,而第二種情況對我來說沒有多大意義。 – resistor

回答

2

這樣做是正確的方法是使用Xlib。使用這個庫,你可以這樣寫代碼:

從一個例子摘自:here

while (1) { 
    XNextEvent(dis, &report); 
    switch (report.type) { 

    case KeyPress: 
     if (XLookupKeysym(&report.xkey, 0) == XK_space) { 
      fprintf (stdout, "The space bar was pressed.\n"); 
     } 
     break; 
    } 
} 

/*This event loop is rather simple. It only checks for an expose event. XNextEvent waits for an event to occur. You can use other methods to get events, which are documented in the manual page for XNextEvent.*/ 

/*Now you will learn how to check if an event is a certain key being pressed. The first step is to put case KeyPress: in your switch for report.type. Place it in a similar manner as case Expose.*/ 

你也可以在映射到鍵盤的專用設備文件中使用pollselect。在我的情況是/dev/input/event1

如果您對映射到keyborad的特殊文件有什麼疑問,請閱讀文件/var/log/Xorg.0.log(搜索單詞keyboard)。

在這裏你有興趣另一個鏈接:Linux keyboard event capturing /dev/inputX

+0

不從事件設備讀取消耗事件,我將不得不將它轉發到X?此外,事件設備的變化,所以我寧願不必管理搞清楚哪些是鍵盤(比事件設備GPIO鍵和i2c鍵盤......) – Kevin

+0

我想我只是找到了你要找的東西。嘗試** xlib **(http://tronche.com/gui/x/xlib/)。特別節10 **活動**。 –

+0

編輯回答,顯示使用xlib的解決方案。 –