2008-09-24 96 views
5

首先,是的,我知道this question,但我在尋找更多的信息。實際上,我有一個相當類似的問題,因爲我需要能夠捕獲鼠標/鍵盤/操縱桿的輸入,並且我還想盡可能避免SDL。我或多或少想知道是否有人知道我可以在哪裏獲得一些體面的底層處理從Linux設備的輸入,甚至可能是一些教程。 SDL非常適合跨平臺輸入處理,但我不打算在SDL中使用任何其他功能,所以我想完全刪除它。建議,意見和幫助都是值得讚賞的。謝謝!在Linux中捕獲輸入

編輯爲了清楚:

的點是捕獲的鼠標移動,鍵盤按下/釋放,鼠標點擊,並且潛在地操縱桿操縱一個遊戲。

+0

我覺得這個問題很廣泛。直接與輸入設備交談? (通常對於高級應用程序來說是一個壞主意。)使用X? (如果X,控制檯模式下的鼠標需要Xlib,XCB,Gtk +,Qt,...)GPM嗎? – asveikau 2012-12-24 01:42:38

回答

5

使用下面看看鏈接的函數void kGUISystemX ::環路(無效)

這是我在Linux上使用的X Windows通過鍵盤和鼠標輸入獲得主循環。

http://code.google.com/p/kgui/source/browse/trunk/kguilinux.cpp

這裏是一個片段:

if(XPending(m_display)) 
    { 
     XNextEvent(m_display, &m_e); 
     switch(m_e.type) 
     { 
     case MotionNotify: 
      m_mousex=m_e.xmotion.x; 
      m_mousey=m_e.xmotion.y; 
     break; 
     case ButtonPress: 
      switch(m_e.xbutton.button) 
      { 
      case Button1: 
       m_mouseleft=true; 
      break; 
      case Button3: 
       m_mouseright=true; 
      break; 
      case Button4:/* middle mouse wheel moved */ 
       m_mousewheel=1; 
      break; 
      case Button5:/* middle mouse wheel moved */ 
       m_mousewheel=-1; 
      break; 
      } 
     break; 
     case ButtonRelease: 
      switch(m_e.xbutton.button) 
      { 
      case Button1: 
       m_mouseleft=false; 
      break; 
      case Button3: 
       m_mouseright=false; 
      break; 
      } 
     break; 
     case KeyPress: 
     { 
      XKeyEvent *ke; 
      int ks; 
      int key; 

      ke=&m_e.xkey; 
      kGUI::SetKeyShift((ke->state&ShiftMask)!=0); 
      kGUI::SetKeyControl((ke->state&ControlMask)!=0); 
      ks=XLookupKeysym(ke,(ke->state&ShiftMask)?1:0); 
...... 
1

你沒有說明你的應用程序的目的,但讀取原始數據開始是很少,你想要什麼,除非你只是爲了好玩(或學校項目或其他)

如果你正在編寫一個GUI應用程序(一個在X11圖形環境中運行的應用程序),你可以依賴圖形工具包(或原始X)輸入驅動程序。

如果你正在編寫一個文本模式的客戶端,那麼readline或甚至ncurses可能是不錯的選擇。

2

如果您知道您的項目只能在Linux下運行(不是Windows或甚至是BSD之一),您應該查看Linux內核的輸入系統。下載kernel source並閱讀Documentation/input/input.txt,特別是evdev系統的說明。

對於更高級別(更便攜)的解決方案,read up on Xlib。顯然它需要一個正在運行的X服務器,但它具有繼承用戶鍵盤設置的優勢。不幸的是遊戲杆事件不包括在內,你可能需要爲這些遊戲杆使用內核遊戲杆API。

-1

您可以從位於/ dev /輸入文件獲得直接輸入。這是最簡單的方法,而且你不需要任何額外的軟件。