วิธีบังคับให้ปล่อยตัวดัดแปลงคีย์บอร์ด


18

บางครั้งเมื่อฉันใช้การทำงานร่วมกันระหว่างเครื่องของฉันเมื่อมีใครใช้แขก VirtualBox แบบเต็มหน้าจอฉันติดอยู่กับการปรับเปลี่ยนคีย์แปลก ๆ บางอย่างที่เปิดอยู่ หากพวกเขามีอยู่บนแป้นพิมพ์ของฉัน (เช่น Shift_L) ฉันสามารถแตะมันและสถานะของพวกเขาจะถูกรีเซ็ตและฉันสามารถพิมพ์ตัวอักษรขนาดเล็กต่อไป แต่บางคนก็ไม่ได้แมปกับแป้นพิมพ์เลย (เช่น ISO_Level3_Shift) ดังนั้นฉันจึงไม่มีวิธีปิดพวกเขาเลย!

จะรีเซ็ตได้อย่างไร? ตอนนี้สิ่งที่ฉันทำได้คือรีบูทคอมพิวเตอร์ แต่มันก็เป็นทางออกที่น่าอาย

สิ่งที่ฉันต้องการคือโปรแกรมที่สามารถ "ดัดแปลง" แป้นพิมพ์ดัดแปลงที่เป็นไปได้ทั้งหมดดังนั้นสถานะของพวกเขาจะถูกรีเซ็ต มันสามารถทำได้?

ฉันใช้ Mint 14 (โคลนของ Ubuntu 12.10 Quantal)

คำตอบ:


22

หากคุณxdotoolติดตั้งคุณก็สามารถใช้

xdotool keyup ISO_Level3_Shift

ซึ่งจะส่งการปล่อยกุญแจ (สำหรับ ISO_Level3_Shift แน่นอน) เหตุการณ์ไปยังเซิร์ฟเวอร์ X

แต่คุณต้องการให้โปรแกรมปล่อยปุ่มตัวดัดแปลงทั้งหมด หนึ่งสามารถใช้ xdotool เพื่อให้บรรลุนั้นได้อย่างง่ายดายถ้าไม่ใช่เพราะฉันไม่มีความคิดว่ามีการกำหนด keysyms ตัวปรับแต่งอะไร วิธีหนึ่งที่เป็นไปได้ในการค้นหาพวกเขาคือการแยกวิเคราะห์keysymdef.h:

grep '^#define' /usr/include/X11/keysymdef.h | sed -r 's/^#define XK_(\S*?).*$/\1/;' | grep -E '_(L|R|Level.*)$'

ซึ่งจะส่งคืน keysyms บางอย่างที่แน่นอนว่าเป็นตัวดัดแปลง น่าเสียดายที่ฉันไม่สามารถหาคำจำกัดความที่แม่นยำของคีย์ตัวปรับแต่งได้ในขณะนี้ดังนั้นฉันไม่ทราบว่าเป็นรายการที่สมบูรณ์หรือไม่

การต่อท้าย| xargs xdotool keyupไปป์ไลน์ข้างต้นจะปล่อยกุญแจเหล่านั้นทั้งหมด ในระบบของฉันมันรันคำสั่งต่อไปนี้:

xdotool keyup Shift_L Shift_R Control_L Control_R Meta_L Meta_R Alt_L Alt_R Super_L Super_R Hyper_L Hyper_R ISO_Level2_Latch ISO_Level3_Shift ISO_Level3_Latch ISO_Level3_Lock ISO_Level5_Shift ISO_Level5_Latch ISO_Level5_Lock

1
ที่ดี! ฉันยังพบว่าคีย์ไม่ได้มอบหมายอาจจะเป็นอุปสรรคผ่าน keycode xdotool keyup 204เช่น
Adam Spires

1
@Adam Spires clued ฉันรหัส keyup สำหรับกรณีของฉันคือรหัส xmodmap เช่น 204 และการใช้ keysymdef.h ไม่ได้ช่วย เพื่อดูรหัสคีย์ xmodmap DISAPLAY=:1 xmodmap -pk | grep -iP 'alt|meta|super|hyper'ลอง: คุณจะต้องเปลี่ยนหมายเลขที่แสดงเป็นหมายเลขที่แสดงผล VNC ที่เสีย
srking

ฉันคิดว่าคุณหมายถึงDISPLAY=:1ในความคิดเห็นข้างต้น
Adam Spires

1
xdotoolรองรับ--clearmodifiersตัวเลือกสำหรับkey/ keydown/ keyup- บางทีมันอาจไม่ได้เมื่อเขียนคำตอบนี้? ฉันคาดหวังว่าxdotool keyup --clearmodifiers spaceจะได้ผล ( xdotool keyupต้องระบุคีย์เพื่อระบุ "เว้นวรรค" โดยพลการ)
Rory O'Kane

6

ฉันค้นพบว่าสำหรับระบบของฉันโซลูชันที่โพสต์ที่เกี่ยวข้องxdotoolมักจะไม่ครอบคลุมกุญแจที่ติดอยู่และการใช้งานsetxkbmapดูเหมือนจะไม่ประสบความสำเร็จในระบบของฉัน

x11vncวิธีการแก้ปัญหาที่ผมค้นพบซึ่งได้ทำงานเพื่อให้ห่างไกลโดยไม่ต้องล้มเหลวคือการใช้งาน โดยเฉพาะฉันใช้คำสั่งต่อไปนี้:

x11vnc -deny_all -clear_keys -timeout 1

-clear_keysเป็นส่วนสำคัญที่นี่ มันแนะนำx11vncให้ล้างปุ่มกดทั้งหมดเมื่อมันออก -timeout 1บอกx11vncให้เลิกหลังจาก 1 วินาทีโดยไม่มีการเชื่อมต่อและ-deny_allทำให้แน่ใจว่าไม่มีใครสามารถเชื่อมต่อระหว่างหน้าต่างนั้นได้

บางครั้งคีย์ที่ติดค้างจะป้องกันการโต้ตอบที่มีความหมายกับเดสก์ท็อปซึ่งในกรณีนี้ฉันจะดำเนินการต่อไปนี้ผ่าน ssh:

env DISPLAY=:0 XAUTHORITY=/home/[username]/.Xauthority x11vnc -deny_all -clear_keys -timeout 1

4

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


0

x11vncคำตอบคือความคิดสร้างสรรค์ แต่ถ้าติดตั้งx11vncเพียงสำหรับการปรับเปลี่ยนการล้างดูเหมือนว่า overkill นี่เป็นทางออกที่ทุบตีที่ใช้xmodmap -pmการส่งออก 's ออก keyup ที่จะปรับเปลี่ยนเป็นที่รู้จักกันทั้งหมด การแปลงจากรหัสฐานสิบหกเป็นทศนิยมขึ้นอยู่กับการขยายเลขคณิตของ Bash

for KEYCODE in $(xmodmap -pm | grep -Pio '(?<=\b0x)[0-9a-f]+\b'); do

    echo -e "xdotool keyup $((16#$KEYCODE))\n" >&2
    xdotool keyup $((16#$KEYCODE))

done

หากคุณเรียกใช้จากแป้นพิมพ์ลัดการเพิ่มsleep 1ที่จุดเริ่มต้น (เพื่อให้มีเวลาสำหรับการเปิดตัวกุญแจทางกายภาพ) จะได้รับคำแนะนำอย่างดี echoเพื่อ stderr ไม่จำเป็นของหลักสูตร; ฉันแค่ต้องการให้สามารถตรวจสอบ~/.xsession-errorsไฟล์ของฉันสำหรับการส่งออกเช่นนี้

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