จะส่งการกดแป้น (F5) จากเทอร์มินัลไปยังโปรแกรม GUI ได้อย่างไร


40

ฉันใช้ Raspberry Pi ร่วมกับ Chromium (โหมดคีออสก์) เพื่อแสดงสถิติ พี่ไม่ได้มีแป้นพิมพ์ที่เกี่ยวโยงกันดังนั้นผมจึงสืบค้นหาวิธีการแก้ปัญหาการกดแป้นพิมพ์ส่งจากสถานีไปยังกระบวนการโครเมี่ยม (แท็บ) อินพุตปกติใช้งานได้ แต่ฉันจะส่งบางสิ่งเช่นF5(คีย์พิเศษ: การรีเฟรชเบราว์เซอร์) ผ่านทางโซลูชันนี้ได้อย่างไร

# pidof chromium
20809 20790 20788 20786 20783
# echo 'some text' > /proc/20809/fd/0

คำตอบ:


51

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

คุณจะต้องค้นหา ID หน้าต่างที่คุณต้องการส่งการกดแป้น คุณสามารถทำได้ด้วย xdotool xdotool search --class Chromeส่งคืนรายการ ID หน้าต่างของหน้าต่าง Chrome ทั้งหมด หากผลตอบแทนมากกว่าหนึ่งคุณจะต้องเลือกหนึ่งที่คุณต้องการ คุณสามารถใช้xdotool search --nameในการจับคู่กับชื่อแทนการเรียน คุณยังสามารถแยกวิเคราะห์ผลลัพธ์ของwmctrlและแยก ID หน้าต่างที่ต้องการ

เมื่อคุณพบ ID หน้าต่างที่ถูกต้องแล้วคุณสามารถโทรหาxdotoolการกดแป้น น่าเสียดายที่แอปพลิเคชันจำนวนมากปฏิเสธกิจกรรมสังเคราะห์เช่นการกดแป้นและกิจกรรมเมาส์ที่ส่งโดยแอปพลิเคชันอื่น นี่เป็นกรณีที่มี Chrome รุ่นปัจจุบัน เป็นไปได้ที่จะฉีดการกดแป้นพิมพ์จากแอปพลิเคชันอื่นโดยกลไกที่แตกต่างกัน แต่ต้องให้หน้าต่างโฟกัส คุณสามารถทำสิ่งเหล่านี้ได้ด้วย xdotool แต่มันจะทำให้การโฟกัสพุ่งไปที่หน้าต่าง Chrome และย้อนกลับอย่างรวดเร็ว ตัวอย่างต่อไปนี้ส่งF5ไปที่หน้าต่าง Chrome แรก (ตามลำดับโดยพลการ)

xdotool search --class Chrome windowactivate --sync %1 key F5 windowactivate $(xdotool getactivewindow)

หรือด้วย xdotool เวอร์ชันเก่า:

xdotool windowactivate $(xdotool search --class Chrome) &&
xdotool key F5 &&
xdotool windowactivate $(xdotool getactivewindow)

จำไว้ว่าสิ่งนี้ส่งF5ไปที่หน้าต่างนั้นและขึ้นอยู่กับโปรแกรมที่จะตัดสินใจว่าจะทำอย่างไรกับมัน ใน Chrome จะเป็นการรีโหลดแท็บปัจจุบัน


4
--windowidธงอยู่ในขณะนี้--window(คำสั่งเตือนคุณเท่า)
หลุยส์แมดดอกซ์

2
--titleตัวเลือกอยู่ในขณะนี้--name(คำสั่งเตือนความนับถือมากที่สุดเท่า)
jpaugh

2
การทำรังไม่จำเป็นต้องทำทั้งหมด xdotool search --class Chrome key F5
phil294

1
@Blauhirn การสร้างรังมีความจำเป็นใน xdotool รุ่นเก่ากว่า แต่ขอบคุณฉันได้อัปเดตคำตอบของฉันเพื่อแสดงไวยากรณ์ที่ใหม่กว่าแล้ว
Gilles 'หยุดความชั่วร้าย'

โอ้และตั้งแต่ฉันอัปเดตสิ่งนี้ Chrome ปฏิเสธกิจกรรมสังเคราะห์ทุกวันนี้ ถอนหายใจ
Gilles หยุดความชั่วร้าย '

15

วิธีแก้ปัญหาที่แนะนำข้างต้นใช้ xdotool เช่นนี้

 xdotool key --windowid <window> <keystroke>

ซึ่งไม่ได้ผลสำหรับฉัน หลังจากการทดลองฉันไปถึง

 xdotool windowactivate --sync <window> key <keystroke>

ครั้งหนึ่งที่ดูเหมือนว่าจะใช้งานได้ฉันได้กำหนดสคริปต์บางส่วนและอัปเดตไฟล์. lircrc ของฉันตามที่แสดง:

http://pcfellow.com/ClementineRemote.html


ฉันสงสัยว่าทำไมตัวอย่างแรกของคุณไม่ทำงาน มันเป็นการดีที่จะส่งการกดแป้นไปยังหน้าต่างที่ไม่ได้โฟกัส
Geremia

1
@ Geremia มันอาจไม่ทำงานด้วยเหตุผลที่ระบุไว้ในบันทึกย่อในเอกสาร xdotool
Janthelme

4

ฉันมีกรณีการใช้งานที่คล้ายกันใน Raspberry Pi ที่ใช้ Raspbian Wheezy ฉันต้องการหมุนแท็บบน Chrome โดยใช้โหมดคีออสก์ (น่าเสียดายที่การติดตั้งส่วนขยายเพื่อทำสิ่งนี้กับ Chrome แบบเก่านั้นไม่เหมาะสมอีกต่อไป) ตัวอย่างคำตอบที่ยอมรับมีการพิมพ์ผิดบางอย่างหรือใช้ไม่ได้กับเวอร์ชันซอฟต์แวร์ของฉันนี่คือสิ่งที่ใช้ได้กับฉัน:

xdotool key --window "$(xdotool search --class Chromium | head -1)" Ctrl+Tab

4

หากคุณใช้ Chromium เพื่อแสดงหน้าเว็บที่กำหนดเองและคุณต้องการให้รีเฟรชเป็นประจำคุณสามารถเพิ่มแท็กต่อไปนี้ได้:

<meta http-equiv="refresh" content="5">

เพื่อรีเฟรชโดยอัตโนมัติทุก 5 วินาที (คุณสามารถตั้งค่าให้สั้นลงหรือนานกว่านั้นได้หากต้องการ)


2
ลองดี แต่ฉันไม่ได้เป็นเจ้าของ Twitter, ซอฟต์แวร์การตรวจสอบของ ISP ของฉันและเว็บไซต์อื่น ๆ ที่ฉันต้องตรวจสอบ;) ฉันอาจจะต้องพูดถึงเรื่องนี้มาก่อน
burnersk

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

2

ฉันเคยใช้ Auto Hot Key มาแล้วในอดีตเพื่อทำสิ่งต่าง ๆ เช่นกดปุ่มส่งอย่างไรก็ตามยังไม่พร้อมใช้งานบน Linux แต่การค้นหาโดย Google อย่างรวดเร็วพบว่ามี IronAHK ( http://www.ironahk.net/ ) มีไม่มาก มีเอกสารให้ใช้ แต่อาจทำเคล็ดลับได้


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