`xdotool` không gửi khóa


8

Tôi đang cố gắng gửi tổ hợp phím qua xdotool. Tuy nhiên, gửi không hoạt động đúng.

Dưới đây là nhật ký của một tập lệnh nên chọn tất cả văn bản trong Gedit và sao chép nó (nhưng nó không làm gì cả), cùng với đầu ra của nó (được ghi lại bằng cách chuyển hướng cả thiết bị xuất chuẩn và thiết bị xuất chuẩn):

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

Tôi đã thử với Thunderbird và tập lệnh sẽ gửi các khóa, nhưng không có sửa đổi (không Control, đó là). Nhân tiện, trong kịch bản, các phím được bao quanh bởi ", như thế "ctrl+a".

Sự khác biệt giữa Gedit và Thunderbird có thể là Gedit là ứng dụng GTK3, trong khi Thunderbird có vẻ là ứng dụng GTK2 (nhưng Firefox, có vẻ như là ứng dụng GTK3, hoạt động giống như Thunderbird).

xdotool phiên bản 3.20141006.1
Hệ điều hành: Debian GNU / Linux 8.1 (Linux kernel 3.16.0-4-amd64)
Trình quản lý máy tính để bàn: Gnome Shell 3.14.4


1
nếu bạn sử dụng xbindkeysthì bạn phải giải phóng các khóa kích hoạt tập lệnh của mình bằng xdotool keyup ...thao tác đáng tin cậy
lấy từ

Câu trả lời:


7

Khi một sự kiện bàn phím hoặc chuột được tạo bởi một ứng dụng chứ không phải bởi một thiết bị ngoại vi đầu vào, sự kiện đó được đánh dấu là Hồi tổng hợp. Nhiều ứng dụng từ chối các sự kiện tổng hợp.

Về lý thuyết, có một lý do bảo mật cho điều đó - bạn có thể chạy một ứng dụng trên màn hình X của mình nhưng dưới một tài khoản khác hoặc trên một máy khác - nhưng X rất tệ trong việc cách ly các ứng dụng (nó không bao giờ được thiết kế cho điều đó) mà bạn không nên Không cho phép các ứng dụng không tin cậy truy cập vào màn hình của bạn. Và nếu bạn không, thì không có lý do gì để từ chối các sự kiện tổng hợp.

Theo như tôi biết, Gtk không đưa ra một cách chung để quyết định có cho phép các sự kiện tổng hợp hay không. Tùy thuộc vào từng ứng dụng và tôi không biết mặc định là gì nếu lập trình viên không quan tâm.

Có một cách khác để thêm các sự kiện đầu vào, với phần mở rộng XTEST. Các sự kiện được tiêm theo cách này xuất hiện chính xác như các sự kiện từ một thiết bị ngoại vi đầu vào: một cách hiệu quả, chúng đến từ một thiết bị ngoại vi đầu vào thử nghiệm. Nhược điểm của phương pháp này là chúng được chuyển đến một cửa sổ giống như mọi sự kiện khác, vì vậy chúng được gửi đến cửa sổ có tiêu điểm (trừ khi bị người quản lý cửa sổ chặn). Bạn có thể gửi các sự kiện XTEST với (các phiên bản gần đây của) xdotool, đó là những gì nó làm nếu bạn không vượt qua ID cửa sổ.

xdotool windowactivate 29360262
xdotool key ctrl+a ctrl+c

Vâng, đó là phiền phức. Bạn có thể tìm thấy một cuộc thảo luận về vấn đề này trên wiki Selenium . Có vẻ như có một cách để gửi các sự kiện giả đến ứng dụng GTK + thông qua tín hiệu GTK hoặc các sự kiện GDK, nhưng tôi không biết cách thức hoạt động của nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.