วิธีแยกอินพุตจากคีย์บอร์ดที่แตกต่างกันอย่างไร


14

ฉันต้องการเขียนแอพพลิเคชั่นใน Python ที่คุณสามารถใช้กับคีย์บอร์ดเริ่มต้นและแอปที่ออกแบบมาเป็นพิเศษสำหรับแอพพลิเคชั่น ฉันจะออกแบบมันง่ายๆโดยใช้แป้นพิมพ์ตัวเลขขนาดเล็กพร้อมสติ๊กเกอร์เพื่อให้การกระทำกับปุ่มต่างๆ คีย์บอร์ดทั้งสองจะต่อกับ USB

อย่างไรก็ตามเมื่อกดปุ่มเหล่านี้เพียงแค่สัญญาณปกติ (ตัวเลขตัวดำเนินการและการป้อน) จะถูกส่งไปยัง Python และจะไม่สามารถแยกความแตกต่างระหว่างสัญญาณจากแป้นพิมพ์หลักและแป้นพิมพ์พิเศษ

เนื่องจาก Python มี (เท่าที่ฉันหาได้) ไม่มีวิธีในการสร้างความแตกต่างนี้ฉันจึงต้องการทำมันบนระบบปฏิบัติการของตัวเอง ฉันจะเขียนโปรแกรมสำหรับ Raspberry Pi ดังนั้นมันจะเป็น Linux

ดังนั้นคำถามหลัก: ฉันจะแมปคีย์ของคีย์บอร์ดเฉพาะกับคีย์อื่นได้อย่างไร ฉันคิดถึงการใช้ปุ่ม F ซึ่งฉันจะไม่ใช้เพื่อจุดประสงค์อื่น หรือเพียงแค่ตัวละครบางตัวที่ไม่มีอยู่บนแป้นพิมพ์ (สมมติว่ามีเช่นนั้น)

เป็นไปได้ใน Linux / Unix? และถ้าเป็นเช่นนั้นฉันจะทำอย่างไร


แป้นพิมพ์จะเชื่อมต่ออย่างไร คุณอาจต้องการอ่านจากอุปกรณ์โดยตรง นั่นเป็นวิธีที่ชัดเจนที่สุดสำหรับฉันแม้ว่าฉันคิดว่าจะมีวิธีที่ดีกว่า
TNW

ฉันเพิ่มว่าพวกเขาจะเชื่อมต่อด้วย USB ฉันจะอ่านโดยตรงจากอุปกรณ์โดยใช้ Python ได้อย่างไร
Steven Roose

ดูเหมือนว่าคำตอบที่ไม่เป็นที่ยอมรับนั้นง่ายกว่าคำตอบที่ยอมรับ
Nikana Reklawyks

คำตอบ:


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

คุณเปิดอุปกรณ์และทุกครั้งที่มีเหตุการณ์มาจากฮาร์ดแวร์อินพุตคุณจะได้รับแพ็กเก็ตข้อมูล หากคุณสามารถอ่าน C คุณสามารถศึกษาไฟล์/usr/include/linux/input.hที่แสดงให้เห็นอย่างชัดเจนว่าสิ่งนี้ทำงานอย่างไร หากไม่มีคุณสามารถอ่านคำถามนี้ซึ่งให้ข้อมูลทั้งหมดที่คุณต้องการ

สิ่งที่ดีเกี่ยวกับอินเทอร์เฟซเหตุการณ์คือคุณเพิ่งทราบว่าคุณต้องการอุปกรณ์ใดและคุณสามารถอ่านอินพุตจากอุปกรณ์อินพุตนั้นเท่านั้นโดยไม่สนใจอุปกรณ์อื่น ๆ ทั้งหมด นอกจากนี้คุณยังจะได้รับการแจ้งเตือนเกี่ยวกับคีย์, ปุ่มและการควบคุมโดยปกติคุณจะไม่ได้โดยเพียงแค่การอ่าน 'สุก' กระแสละครจากสถานี: แม้กุญแจตายชอบShiftฯลฯ

สิ่งที่ไม่ดีคือการที่อินเตอร์เฟซที่เหตุการณ์ไม่ได้กลับตัวอักษร 'สุก' ก็แค่ใช้รหัสตัวเลขสำหรับคีย์ (รหัสที่สอดคล้องกับแต่ละคีย์ที่พบในไฟล์ส่วนหัวดังกล่าวข้างต้น - แต่ยังอยู่ในแหล่งที่มาของงูหลามevent.pyหากอุปกรณ์ป้อนข้อมูลของคุณมีคีย์ / ปุ่มที่ผิดปกติคุณอาจต้องทดลองสักเล็กน้อยจนกว่าคุณจะได้ตัวเลขที่ถูกต้อง


2

ทางเลือกอื่น (หาก "แป้นพิมพ์" ของคุณไม่มีแป้นจำนวนมาก - อุปกรณ์จำนวนมากที่อ้างว่าเป็นแป้นพิมพ์) คือการใช้การกดปุ่มบนแป้นพิมพ์กับแต่ละแป้นพิมพ์โดยเฉพาะและตรวจสอบให้แน่ใจว่าแป้นแตกต่างกัน

นี้จะระบุไว้ที่นี่: /superuser/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only ประเด็นหลักคือการsetxkbmapใช้อุปกรณ์โต้แย้ง

หากคุณใช้วิธีการป้อนข้อมูลแบบดิบ lsinput จะค้นหาอุปกรณ์ดิบของคุณให้คุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.