Bash의 마우스 포인터 아래에서 X 창 ID를 찾는 방법은 무엇입니까?

Bash의 마우스 포인터 아래에서 X 창 ID를 찾는 방법은 무엇입니까?

Bash 스크립트에서 마우스 포인터 아래에 있는 X 창의 ID를 얻을 수 있는 방법이 있습니까?

(편집) 프로세스가 비대화형이어야 합니다.

답변1

xdotool포인터 위치( xdotool getmouselocation)를 노출하고,최신 버전(2.20110530.1 기준)은 해당 위치에 어떤 창이 있는지도 나타냅니다.. 보이는 화면 위치로 창을 일치시킬 방법이 없는 것 xwininfo같습니다 .wmctrlxdotool

기본 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를 얻습니다.

시도 해봐:)

관련 정보