키 입력을 보내려고 합니다 xdotool
. 그런데 전송이 제대로 되지 않습니다.
다음은 Gedit에서 모든 텍스트를 선택하고 복사(아무 작업도 수행하지 않음)하고 출력(stdout 및 stderr를 리디렉션하여 캡처)하는 스크립트의 로그입니다.
+ xdotool getwindowname 29360262
*Unsaved Document 1 - gedit
+ xdotool key --window 29360262 ctrl+a
+ sleep 1
+ xdotool key --window 29360262 ctrl+c
+ sleep 1
나는 Thunderbird를 시도했고 스크립트는 키 누르기를 보냈지만 수정자는 없었습니다( Control
예: 아니요). 그런데 스크립트에서 키는 "
와 같이 로 둘러싸여 있습니다 "ctrl+a"
.
Gedit와 Thunderbird의 차이점은 Gedit는 GTK3 애플리케이션인 반면 Thunderbird는 GTK2 애플리케이션인 것처럼 보입니다(그러나 Firefox는 GTK3 애플리케이션인 것으로 보이며 Thunderbird처럼 동작합니다).
xdotool 버전 3.20141006.1
운영 체제: Debian GNU/Linux 8.1(Linux 커널 3.16.0-4-amd64)
데스크탑 관리자: GNOME Shell 3.14.4
답변1
키보드 또는 마우스 이벤트가 입력 주변 장치가 아닌 응용 프로그램에 의해 생성되면 해당 이벤트는 "합성"으로 표시됩니다. 많은 애플리케이션은 합성 이벤트를 거부합니다.
이론적으로 여기에는 보안상의 이유가 있습니다. X 모니터에서 실행되는 응용 프로그램이 있을 수 있지만 다른 계정이나 다른 컴퓨터에서 실행될 수도 있습니다. 그러나 X는 응용 프로그램을 격리하는 데 매우 좋지 않습니다(이를 위해 설계되지 않았습니다). 신뢰할 수 없는 애플리케이션이 디스플레이에 액세스하는 것을 전혀 허용해서는 안 됩니다. 그렇지 않다면 합성 이벤트를 거부할 이유가 없습니다.
내가 아는 한, Gtk는 합성 이벤트를 허용할지 여부를 결정하는 일반적인 방법을 제공하지 않습니다. 개별 응용 프로그램에 따라 다르며 프로그래머가 신경 쓰지 않으면 기본값이 무엇인지 알 수 없습니다.
입력 이벤트를 삽입하는 또 다른 방법인 XTEST 확장이 있습니다. 이런 방식으로 주입된 이벤트는 입력 주변 장치에서 나오는 이벤트와 똑같아 보입니다. 실제로 이벤트는 "테스트" 입력 주변 장치에서 나옵니다. 이 접근 방식의 단점은 이벤트가 다른 이벤트와 동일한 방식으로 창으로 라우팅되므로 포커스가 있는 창으로 전송된다는 것입니다(창 관리자가 가로채지 않는 한). xdotool(최신 버전)을 사용하여 XTEST 이벤트를 보낼 수 있으며 창 ID를 전달하지 않으면 이 작업이 수행됩니다.
xdotool windowactivate 29360262
xdotool key ctrl+a ctrl+c
네, 짜증나네요. 이 문제에 대한 토론은 다음에서 찾을 수 있습니다.셀레늄 위키. GTK 신호나 GDK 이벤트를 통해 GTK+ 애플리케이션에 가짜 이벤트를 보내는 방법이 있는 것 같지만 어떻게 작동하는지 모르겠습니다.
답변2
어리석게 들릴 수도 있지만 Wayland가 아닌 X11을 사용하고 있는지 확인하세요.
echo $XDG_SESSION_TYPE
출력하면 작동하지 않습니다 wayland
(엑스도구)