Làm cách nào để gửi tổ hợp phím (F5) từ thiết bị đầu cuối đến chương trình GUI?


40

Tôi đang sử dụng Raspberry Pi kết hợp với Chromium (chế độ kiosk) để hiển thị một số thống kê. Pi không có bàn phím được kết nối nên tôi đã tìm kiếm một giải pháp để gửi tổ hợp phím từ thiết bị đầu cuối đến quy trình Chromium (tab) . Đầu vào bình thường không hoạt động nhưng làm cách nào để gửi một cái gì đó như F5(một khóa đặc biệt: làm mới trình duyệt) thông qua giải pháp này?

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

Câu trả lời:


51

Chương trình GUI không đọc từ đầu vào tiêu chuẩn của họ, họ nhận được đóng góp của họ từ các máy chủ X . Có các công cụ để gõ phím vào cửa sổ. xdotool là khá phổ biến và thuận tiện.

Bạn sẽ cần tìm ID cửa sổ mà bạn muốn gửi tổ hợp phím. Bạn có thể làm điều đó với xdotool. xdotool search --class Chrometrả về danh sách ID cửa sổ của tất cả các cửa sổ Chrome. Nếu điều này trả về nhiều hơn một, bạn cần chọn cái bạn muốn. Bạn có thể sử dụng xdotool search --nameđể khớp với tiêu đề thay vì lớp. Bạn cũng có thể phân tích đầu ra của wmctrl và trích xuất ID cửa sổ mong muốn.

Khi bạn đã tìm thấy ID cửa sổ phù hợp, bạn có thể gọi xdotoolđể gõ phím. Thật không may, nhiều ứng dụng từ chối các sự kiện tổng hợp, tức là tổ hợp phím và sự kiện chuột được gửi bởi một ứng dụng khác. Đây là trường hợp với các phiên bản hiện tại của Chrome. Có thể tiêm một tổ hợp phím từ một ứng dụng khác bằng một cơ chế khác, nhưng điều đó đòi hỏi cửa sổ phải được tập trung. Bạn có thể làm tất cả những điều đó với xdotool, nhưng nó sẽ khiến tiêu điểm nhanh chóng nhấp nháy vào cửa sổ Chrome và quay lại. Đoạn mã sau sẽ gửi F5đến cửa sổ Chrome đầu tiên (theo thứ tự hơi tùy ý).

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

Hoặc với các phiên bản cũ hơn của xdotool:

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

Hãy nhớ rằng điều này sẽ gửi F5đến cửa sổ đó và tùy thuộc vào chương trình để quyết định phải làm gì với nó. Trong Chrome, điều này tải lại tab hiện tại.


4
các --windowidlá cờ tại là --window(lệnh cảnh báo bạn càng nhiều)
Louis Maddox

2
Các --titletùy chọn tại là --name(các lệnh một cách trung thực cảnh báo càng nhiều)
jpaugh

2
việc làm tổ là hoàn toàn không cần thiết, nó phải là xdotool search --class Chrome key F5
phil294 ngày

1
@Blauhirn Việc lồng nhau là cần thiết trong các phiên bản cũ của xdotool. Nhưng cảm ơn, tôi đã cập nhật câu trả lời của mình để hiển thị cú pháp mới hơn.
Gilles 'SO- đừng trở nên xấu xa'

Ồ, và vì tôi đang cập nhật điều này, Chrome từ chối các sự kiện tổng hợp ngày nay. thở dài
Gilles 'SO- đừng trở nên xấu xa'

15

Giải pháp được đề xuất ở trên đã sử dụng xdotool như thế này

 xdotool key --windowid <window> <keystroke>

mà không làm việc cho tôi. Sau một vài thử nghiệm, tôi đã đến

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

Một lần, điều đó dường như đang hoạt động, tôi đã xác định một số tập lệnh và cập nhật tệp .lircrc của mình như hiển thị ở đây:

http://pcfellow.com/ClementineRemote.html


Tôi tự hỏi tại sao ví dụ đầu tiên của bạn không hoạt động? Sẽ thật tuyệt khi gửi tổ hợp phím đến các cửa sổ không tập trung.
Lão máu

1
@Geremia, nó có thể không hoạt động vì lý do được cung cấp trong GHI CHÚ TUYỆT VỜI trong tài liệu xdotool.
Janthelme

4

Tôi đã có một trường hợp sử dụng tương tự trên một Raspberry Pi chạy Raspbian Wheezy. Tôi cần xoay các tab trên Chrome bằng chế độ kiosk (đáng buồn thay, cài đặt tiện ích mở rộng để thực hiện việc này trên Chrome cũ không còn hợp lý nữa). Ví dụ về câu trả lời được chấp nhận có một số lỗi chính tả hoặc đơn giản là không hoạt động với các phiên bản phần mềm của tôi, đây là những gì phù hợp với tôi:

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

4

Nếu bạn đang sử dụng Chromium để hiển thị trang web tùy chỉnh và bạn muốn nó được làm mới thường xuyên, bạn có thể thêm thẻ sau vào đó:

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

để tự động làm mới sau mỗi 5 giây (bạn có thể đặt nó ngắn hơn hoặc dài hơn nếu bạn muốn).


2
Thử rất tốt nhưng tôi không sở hữu Twitter, phần mềm giám sát ISP của tôi và các trang web khác mà tôi phải theo dõi;) Tôi có lẽ nên đề cập đến điều này trước đây
burnersk

4
Bạn có thể chèn thẻ đó vào trang bằng tập lệnh người dùng. Có thể là một giải pháp ít giòn hơn gửi một phím nhấn vào cửa sổ.
sherbang

2

Trước đây tôi đã từng sử dụng Auto Hot Key để thực hiện những việc như gửi phím bấm, tuy nhiên điều đó không có trên Linux, nhưng một tìm kiếm nhanh của Google cho thấy rằng có IronAHK ( http://www.ironahk.net/ ) không có nhiều tài liệu có sẵn, nhưng nó có thể làm thủ thuật.


Các liên kết không còn hoạt động.
Antonín Procházka
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.