Bash 스크립트에서 마우스 포인터 아래에 있는 X 창의 ID를 얻을 수 있는 방법이 있습니까?
(편집) 프로세스가 비대화형이어야 합니다.
답변1
xdotool
포인터 위치( xdotool getmouselocation
)를 노출하고,최신 버전(2.20110530.1 기준)은 해당 위치에 어떤 창이 있는지도 나타냅니다.. 보이는 화면 위치로 창을 일치시킬 방법이 없는 것 xwininfo
같습니다 .wmctrl
xdotool
기본 X 라이브러리 호출은 다음과 같습니다.XQueryPointer
(메시지에 해당 QueryPointer
) 다음은 이 호출에 대한 간단한 Python 래퍼 스크립트입니다(사용:ctypes
). 오류 검사는 대부분 생략됩니다. 이는 화면 0을 사용하고 있다고 가정합니다(모니터에 여러 화면이 있을 수 있다는 것을 모르는 경우 이를 무시하십시오).
#! /usr/bin/env python
import sys
from ctypes import *
Xlib = CDLL("libX11.so.6")
display = Xlib.XOpenDisplay(None)
if display == 0: sys.exit(2)
w = Xlib.XRootWindow(display, c_int(0))
(root_id, child_id) = (c_uint32(), c_uint32())
(root_x, root_y, win_x, win_y) = (c_int(), c_int(), c_int(), c_int())
mask = c_uint()
ret = Xlib.XQueryPointer(display, c_uint32(w), byref(root_id), byref(child_id),
byref(root_x), byref(root_y),
byref(win_x), byref(win_y), byref(mask))
if ret == 0: sys.exit(1)
print child_id.value
사용 예:
xwininfo -tree -id $(XQueryPointer)
답변2
이 xwininfo
명령은 이러한 종류의 출력을 제공하지만 정보를 얻으려는 창을 클릭해야 합니다.
% xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0xa0000d "flask"
...
이렇게 하면: xwininfo | grep 'Window id:'
ID를 구문 분석할 수 있는 무언가가 제공될 수 있습니다.
답변3
이것을 시도해 보십시오. xdotool만 사용하지만 버전은 "2.20110530.1" 이상입니다.
xdotool getmouselocation --shell | grep WINDOW
창 ID를 직접 얻으려면 다음 명령을 사용할 수 있습니다.
sedGetValue='s/.*=\(.*\)/\1/' # or more readable: sedGetValue='s".*=\(.*\)"\1"' # as / \ confuses me
windowId=`xdotool getmouselocation --shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"`
echo $windowId
답변4
xdotool이면 충분합니다.
실행 xdotool getactivewindow
하면 결과(int) 창이 모든 모니터에 나타날 수 있습니다. 클릭을 기다리는 x11 포인터의 위치를 읽으세요 :) 원격 창이든, vncserver든, 큐브 데스크톱 환경의 세 번째 데스크톱이든 상관없습니다. 그게 다야.
더 나은 테스트를 위해 잠을 자면서 플레이할 수 있습니다 sleep 3; xdotool click 1+2; xdotool getactivewindow
.
getwindowsfocus
반환된 값이 와 동일하다는 것을 알았습니다 getactivewindow
.
수동으로 클릭하면 컨텍스트 메뉴가 표시되지만 1+2를 클릭하면 현재 마우스 위치를 클릭할 때 두 번의 클릭이 트리거되고 원하는 ID를 얻습니다.
시도 해봐:)