Bagaimana cara mengirim keystrokes (F5) dari terminal ke program GUI?


40

Saya menggunakan Raspberry Pi dalam kombinasi dengan Chromium (mode kios) untuk menampilkan beberapa statistik. Pi tidak memiliki keyboard yang terhubung jadi saya mencari solusi untuk mengirim penekanan tombol dari terminal ke proses Chromium (tab) . Input normal berfungsi tetapi bagaimana saya mengirim sesuatu seperti F5(kunci khusus: refresh browser) melalui solusi ini?

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

Jawaban:


51

Program GUI tidak membaca dari input standar mereka, mereka mendapatkan masukan mereka dari X server . Ada alat untuk menyuntikkan keystroke ke jendela. xdotool cukup umum dan nyaman.

Anda harus menemukan ID jendela yang ingin Anda kirimi penekanan tombol. Anda dapat melakukannya dengan xdotool. xdotool search --class Chromemengembalikan daftar ID jendela semua jendela Chrome. Jika ini mengembalikan lebih dari satu, Anda harus memilih yang Anda inginkan. Anda dapat menggunakan xdotool search --nameuntuk mencocokkan pada judul, bukan kelas. Anda juga dapat menguraikan output wmctrl dan mengekstrak ID jendela yang diinginkan.

Setelah menemukan jendela ID yang benar, Anda dapat menelepon xdotooluntuk menyuntikkan penekanan tombol. Sayangnya, banyak aplikasi menolak acara sintetis, yaitu penekanan tombol dan acara mouse yang dikirim oleh aplikasi lain. Ini adalah kasus dengan versi Chrome saat ini. Dimungkinkan untuk menyuntikkan penekanan tombol dari aplikasi lain dengan mekanisme yang berbeda, tetapi itu membutuhkan jendela untuk fokus. Anda dapat melakukan semua itu dengan xdotool, tetapi itu akan menyebabkan fokus berkedip cepat ke jendela Chrome dan kembali. Cuplikan berikut dikirimkan F5ke jendela Chrome pertama (dalam urutan agak sewenang-wenang).

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

Atau dengan versi xdotool yang lebih lama:

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

Ingat bahwa ini dikirim F5ke jendela itu dan terserah pada program untuk memutuskan apa yang harus dilakukan dengannya. Di Chrome, ini memuat ulang tab saat ini.


4
yang --windowidflag sekarang --window(perintah memperingatkan Anda sebanyak)
Louis Maddox

2
The --titlepilihan adalah sekarang --name(perintah setia memperingatkan sebanyak)
jpaugh

2
sarangnya sama sekali tidak perlu, seharusnya xdotool search --class Chrome key F5
phil294

1
@ Belauhirn Sarang diperlukan di versi xdotool yang lebih lama. Tapi terima kasih, saya telah memperbarui jawaban saya untuk juga menunjukkan sintaks yang lebih baru.
Gilles 'SANGAT berhenti menjadi jahat'

Oh, dan karena saya memperbarui ini, Chrome menolak acara sintetis saat ini. menghela nafas
Gilles 'berhenti menjadi jahat'

15

Solusi yang disarankan di atas menggunakan xdotool seperti ini

 xdotool key --windowid <window> <keystroke>

yang tidak berhasil untuk saya. Setelah beberapa percobaan, saya tiba di

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

Suatu kali, itu sepertinya berfungsi, saya mendefinisikan beberapa skrip dan memperbarui file .lircrc saya seperti yang ditunjukkan di sini:

http://pcfellow.com/ClementineRemote.html


Saya ingin tahu mengapa contoh pertama Anda tidak berhasil? Akan menyenangkan untuk mengirim penekanan tombol ke windows yang tidak fokus.
Geremia

1
@Geremia, mungkin tidak berfungsi karena alasan yang disediakan dalam CATATAN SENDEVENT dalam dokumentasi xdotool.
Janthelme

4

Saya memiliki kasus penggunaan yang sama pada Raspberry Pi menjalankan Raspbian Wheezy. Saya perlu memutar tab di Chrome menggunakan mode kios (sayangnya, memasang ekstensi untuk melakukan ini di Chrome lama tidak lagi masuk akal). Contoh jawaban yang diterima memiliki beberapa kesalahan ketik atau sama sekali tidak berfungsi dengan versi perangkat lunak saya, inilah yang bekerja untuk saya:

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

4

Jika Anda menggunakan Chromium untuk menampilkan halaman web khusus dan Anda ingin me-refresh secara teratur, Anda dapat menambahkan tag berikut untuk itu:

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

untuk menyegarkan secara otomatis setiap 5 detik (Anda dapat mengaturnya lebih pendek atau lebih lama jika Anda mau).


2
Usaha yang bagus tetapi saya tidak memiliki Twitter, perangkat lunak pemantauan ISP saya dan situs lain yang harus saya monitor;) Saya mungkin harus menyebutkan ini sebelumnya
burnersk

4
Anda bisa memasukkan tag itu ke halaman menggunakan skrip pengguna. Mungkin menjadi solusi yang kurang rapuh daripada mengirim penekanan tombol ke jendela.
sherbang

2

Saya secara historis menggunakan Kunci Panas Otomatis untuk melakukan hal-hal seperti mengirim penekanan tombol, namun itu tidak tersedia di Linux, tetapi pencarian Google cepat mengungkapkan bahwa ada IronAHK ( http://www.ironahk.net/ ) tidak ada banyak dokumentasi belum tersedia, tetapi mungkin bisa dilakukan.


Tautan tidak lagi berfungsi.
Antonín Procházka
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.