`xdotool` tidak mengirim kunci

8

Saya mencoba mengirim penekanan tombol melalui xdotool. Namun, pengiriman tidak berfungsi dengan baik.

Di bawah ini adalah log skrip yang harus memilih semua teks di Gedit dan menyalinnya (tetapi tidak melakukan apa-apa), bersama dengan hasilnya (ditangkap dengan mengarahkan ulang stdout dan stderr):

+ xdotool getwindowname 29360262
*Unsaved Document 1 - gedit
+ xdotool key --window 29360262 ctrl+a
+ sleep 1
+ xdotool key --window 29360262 ctrl+c
+ sleep 1

Saya telah mencoba dengan Thunderbird, dan skrip mengirim kunci, tetapi tanpa pengubah (tidak Control, itu). By the way, dalam skrip, kunci dikelilingi oleh ", seperti "ctrl+a".

Perbedaan antara Gedit dan Thunderbird mungkin bahwa Gedit adalah aplikasi GTK3, sementara Thunderbird tampaknya merupakan aplikasi GTK2 (tetapi Firefox, yang tampaknya merupakan aplikasi GTK3, berperilaku seperti Thunderbird).

xdotool versi 3.20141006.1
Sistem Operasi: Debian GNU / Linux 8.1 (Kernel Linux 3.16.0-4-amd64)
Desktop Manager: GNOME Shell 3.14.4

Elena
sumber
1
jika Anda gunakan xbindkeysmaka Anda harus melepaskan kunci yang memicu skrip Anda xdotool keyup ...untuk operasi yang andal
grabantot

Jawaban:

7

Ketika acara keyboard atau mouse dihasilkan oleh aplikasi dan bukan oleh perangkat input, acara itu ditandai sebagai "sintetis". Banyak aplikasi menolak acara sintetis.

Secara teori, ada alasan keamanan untuk itu - Anda mungkin menjalankan aplikasi pada layar X Anda tetapi di bawah akun yang berbeda atau pada mesin yang berbeda - tetapi X begitu buruk dalam mengisolasi aplikasi (tidak pernah dirancang untuk itu) sehingga Anda tidak boleh bolehkan aplikasi yang tidak dipercaya sama sekali mengakses tampilan Anda. Dan jika tidak, maka tidak ada alasan untuk menolak acara sintetis.

Sejauh yang saya tahu, Gtk tidak menawarkan cara umum untuk memutuskan apakah akan mengizinkan acara sintetis. Terserah aplikasi individual, dan saya tidak tahu apa defaultnya jika programmer tidak peduli.

Ada cara lain untuk menyuntikkan peristiwa masukan, dengan ekstensi XTEST. Peristiwa yang disuntikkan dengan cara ini tampak persis seperti peristiwa dari periferal input: secara efektif, mereka datang dari periferal input "test". Kelemahan dari pendekatan ini adalah bahwa mereka diarahkan ke jendela dengan cara yang sama seperti acara lainnya, jadi mereka dikirim ke jendela yang memiliki fokus (kecuali dicegat oleh manajer jendela). Anda dapat mengirim acara XTEST dengan (versi terbaru dari) xdotool, itulah yang dilakukannya jika Anda tidak memberikan ID jendela.

xdotool windowactivate 29360262
xdotool key ctrl+a ctrl+c

Ya, itu menyebalkan. Anda dapat menemukan diskusi tentang masalah ini di wiki Selenium . Tampaknya ada cara untuk mengirim acara palsu ke aplikasi GTK + melalui sinyal GTK atau acara GDK, tapi saya tidak tahu cara kerjanya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber