bash 스크립트에서 마우스 포인터 아래에 X 창의 ID를 얻는 방법이 있습니까?
(편집) 비 대화식 프로세스가 필요합니다.
답변
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)
답변
이 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를 파싱 할 수있는 것을 줄 수 있습니다.
답변
시도해보십시오. xdotool 만 사용하지만 버전은 “2.20110530.1”이상입니다.
xdotool getmouselocation --shell | grep WINDOW
창 ID를 직접 얻으려면 다음을 사용할 수 있습니다.
sedGetValue='s/.*=\(.*\)/\1/'
windowId=`xdotool getmouselocation --shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"`
echo $windowId
답변
xdotool은 그렇게하기에 충분합니다.
실행 xdotool getactivewindow
하면 결과가 표시됩니다 (int) 창이 모니터 이상일 수 있습니다. 클릭 대기중인 x11 포인터가있는 위치를 읽으십시오 :), 원격 데스크톱, vncserver 또는 큐브 데스크톱 환경의 세 번째 데스크톱인지 여부에 관계없이 읽으십시오. 그냥 작동합니다.
더 나은 테스트를 위해 절전 모드를 사용하여 재생할 수 있습니다 sleep 3; xdotool click 1+2; xdotool getactivewindow
.
나는와 getwindowsfocus
같은 값 을 반환하는 것을 보았습니다 getactivewindow
.
수동으로 클릭하면 상황에 맞는 메뉴가 표시되지만 1 + 2를 클릭하면 현재 마우스 위치를 클릭하고 원하는 ID를 얻을 때 두 번의 클릭이 모두 발생합니다.
시도 해봐 🙂
답변
python-xlib에 액세스 할 수 있다면 Gilles의 대답과 동일하고 더 짧고 더 많은 pythonic이 있습니다.
from Xlib.display import Display
display = Display()
window = display.screen().root
result = window.query_pointer()
print(result.child.id)
답변
답변
ArchWiki 는 이것에 대한 좋은 답변을 가지고 있습니다 :
activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}
sed
이것을 사용 하면 한 줄로 할 수 있습니다. 아마 가장 읽기 쉬운 방법 일 것입니다 :
activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')"
주 xdotool
내 데비안 최소한의 X11의 동안 실종됐다가 xprop
(역시 포함되었다 sed
물론).
포크하고 싶지 sed
않거나 grep
텍스트 변환을 완전히 수행 할 수 없다면 변경 결과가 약간 변경되는 bash
경우 조금 더 안전합니다 xprop
.
activeWin="$(xprop -root)"
activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}'
activeWin="${activeWin%%?_NET_*}'
activeWin="${activeWin##* }'
어쨌든 여전히 간단한 작업을 보관하는 이상한 방법입니다.