अलग-अलग कीबोर्ड से इनपुट कैसे भेद करें?


14

मैं पायथन में एक एप्लिकेशन लिखना चाहता हूं जिसे आप अपने डिफ़ॉल्ट कीबोर्ड और एप्लिकेशन के लिए विशेष रूप से डिज़ाइन किए गए एक के साथ उपयोग कर सकते हैं। मैं इसे अलग-अलग चाबियों के लिए कार्रवाई करने के लिए स्टिकर के साथ एक छोटे संख्यात्मक कीबोर्ड का उपयोग करके बस डिजाइन करूंगा। दोनों कीबोर्ड यूएसबी द्वारा अटैच होंगे।

हालांकि, जब इन कुंजियों को दबाया जाता है, तो बस उनके नियमित सिग्नल (संख्या, ऑपरेटर और प्रवेश करते हैं), पायथन को भेजे जाएंगे और यह मुख्य कीबोर्ड और विशेष कीबोर्ड से संकेतों के बीच अंतर करने में सक्षम नहीं होगा।

क्योंकि पायथन के पास (जहाँ तक मैं पा सकता था) इस अंतर को बनाने का कोई तरीका नहीं है, मैं इसे ओएस पर ही करना चाहता हूँ। मैं इसे रास्पबेरी पाई के लिए प्रोग्रामिंग करूंगा, इसलिए यह लिनक्स होगा।

तो, मुख्य सवाल: मैं अन्य कीबोर्ड के लिए एक विशिष्ट कीबोर्ड की चाबियाँ कैसे हटा सकता हूं। मैंने एफ-कीज़ का उपयोग करने के बारे में सोचा जो मैं अन्य उद्देश्यों के लिए उपयोग नहीं करूंगा; या बस कुछ अक्षर जो किसी भी कीबोर्ड पर मौजूद नहीं हैं (यह मानकर कि ऐसे हैं)।

क्या लिनक्स / यूनिक्स में यह संभव है? और यदि हां, तो मैं यह कैसे कर सकता हूं?


कीबोर्ड कैसे अटैच होने वाला है? आप डिवाइस से सीधे पढ़ना चाह सकते हैं। यह मेरे लिए सबसे स्पष्ट तरीका है, हालांकि मुझे लगता है कि कुछ बेहतर तरीका है।
TNW

मैंने जोड़ा कि वे USB से जुड़ेंगे। मैं पायथन का उपयोग करके डिवाइस से सीधे कैसे पढ़ सकता हूं?
स्टीवन रूज

ऐसा लगता है कि स्वीकार किए गए उत्तर को स्वीकार किए गए की तुलना में बहुत सरल है।
निकाना रेक्लवैक्स

जवाबों:


12

यदि आप लिनक्स का उपयोग कर रहे हैं, तो इनपुट डिवाइस के बीच अंतर करने का सबसे अच्छा तरीका लिनक्स इवेंट इंटरफ़ेस का उपयोग करना है । डिवाइस के हार्डवेयर-विशिष्ट इनपुट के डिकोड होने के बाद, यह एक मध्यवर्ती लिनक्स-विशिष्ट ईवेंट संरचना में परिवर्तित हो जाता है और इसके तहत एक या अधिक वर्ण डिवाइसों को पढ़कर उपलब्ध कराया जाता है /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

आप डिवाइस को खोलते हैं, और हर बार जब इनपुट हार्डवेयर से कोई घटना आती है, तो आपको डेटा का एक पैकेट मिलेगा। यदि आप सी पढ़ सकते हैं, तो आप उस फ़ाइल का अध्ययन कर सकते हैं /usr/include/linux/input.hजो यह दिखाता है कि यह सामान कैसे काम करता है। यदि आप नहीं करते हैं, तो आप इस प्रश्न को पढ़ सकते हैं जो आपको आवश्यक सभी जानकारी प्रदान करता है।

इवेंट इंटरफ़ेस के बारे में अच्छी बात यह है कि आपको केवल यह पता लगाना है कि आपको किस डिवाइस की आवश्यकता है, और आप केवल उस इनपुट डिवाइस से इनपुट पढ़ सकते हैं , अन्य सभी को अनदेखा कर सकते हैं। आपको कुंजी, बटन और नियंत्रण के बारे में सूचनाएं भी मिलेंगी, जो सामान्य रूप से टर्मिनल से 'पका हुआ' चरित्र स्ट्रीम पढ़ने से नहीं होगा: यहां तक ​​कि मृत कुंजी जैसे Shift, आदि।

बुरी बात यह है कि ईवेंट इंटरफ़ेस 'पकाया हुआ' वर्णों को वापस नहीं करता है, यह सिर्फ कुंजियों के लिए संख्यात्मक कोड का उपयोग करता है (प्रत्येक कुंजी के अनुरूप कोड उक्त हेडर फ़ाइल में पाए जाते हैं - लेकिन इवेंटहोम के पायथन स्रोत में भी । यदि आपके इनपुट डिवाइस में असामान्य कुंजी / बटन हैं, तो आपको सही नंबर प्राप्त करने तक थोड़ा प्रयोग करने की आवश्यकता हो सकती है।


2

एक वैकल्पिक दृष्टिकोण (यदि आपके "कीबोर्ड" में कई चाबियाँ नहीं हैं - कई डिवाइस कीबोर्ड का दिखावा करते हैं) विशेष रूप से प्रत्येक कीबोर्ड पर कीमैपिंग लागू करना और यह सुनिश्चित करना है कि कुंजी प्रतिष्ठित हैं।

इसे यहाँ उल्लिखित किया गया है: /superuser/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only । मुख्य बिंदु setxkbmapडिवाइस तर्क लेता है।

यदि आप कच्चे इनपुट दृष्टिकोण का उपयोग कर रहे हैं तो lsinput आपके लिए आपके कच्चे उपकरण को खोज लेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.