Linux

如何區分來自不同鍵盤的輸入?

  • January 7, 2017

我想用 Python 編寫一個應用程序,你可以使用你的預設鍵盤和一個專門為應用程序設計的鍵盤。我將簡單地通過使用帶有貼紙的小型數字鍵盤來設計它,以對不同的鍵進行操作。兩個鍵盤都將通過 USB 連接。

但是,當按下這些鍵時,只會將它們的正常信號(數字、運算符和輸入)發送到 Python,它無法區分來自主鍵盤和特殊鍵盤的信號。

因為 Python 沒有(據我所知)沒有辦法進行這種區分,所以我想在作業系統本身上做。我將為 Raspberry Pi 進行程式,所以它將是 Linux。

所以,主要問題是:如何將特定鍵盤的鍵重新映射到其他鍵碼。我考慮過使用不會用於其他目的的 F 鍵;或者只是任何鍵盤上不存在的一些字元(假設有這樣的字元)。

這在 Linux/Unix 中可能嗎?如果是這樣,我該怎麼做?

如果您使用的是 Linux,區分輸入設備的最佳方法是使用Linux 事件介面。設備的特定於硬體的輸入被解碼後,它被轉換為特定於 Linux 的中間事件結構,並通過讀取/dev/input/. 順便說一句,這完全獨立於您使用的程式語言。

每個硬體設備都有自己的/dev/input/eventX設備,也有聚合(例如/dev/input/mice,它代表系統中所有滑鼠的運動)。您的系統可能還具有/dev/input/by-path/dev/input/by-id

有一個ioctl呼叫EVIOCGNAME,它將設備名稱作為人類可讀的字元串返回,或者您可以使用類似/dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse.

你打開設備,每次事件從輸入硬體到達時,你都會得到一個數據包。如果你能讀 C,你就可以研究/usr/include/linux/input.h顯示這些東西是如何工作的文件。如果你不這樣做,你可以閱讀這個問題,它提供了你需要的所有資訊。

事件介面的好處是您只需找出您需要的設備,並且您可以讀取來自該輸入設備的輸入,而忽略所有其他設備。您還將獲得有關鍵、按鈕和控制項的通知,而這些通知通常是通過從終端讀取“熟”字元流來實現的:甚至是死鍵Shift,例如 等。

壞事是事件介面不返回“熟”字元,它只是使用數字程式碼作為鍵(與每個鍵對應的程式碼可以在上述標頭檔中找到——也可以在event.py的 Python 原始碼中找到。如果您的輸入設備有不尋常的按鍵/按鈕,您可能需要進行一些試驗,直到獲得正確的數字。

引用自:https://unix.stackexchange.com/questions/72483