QX11Info 클래스를 사용하여 Qt에서 X11 정보를 쿼리 할 수 있습니다. 해당 설명서를 참조하십시오. 그런 다음 원시 Xlib을 사용할 수 있습니다.
XGrabPointer()
을 사용할 수 있습니다. 그것을 사용하면 다른 애플 리케이션 포인터를 잡는 동안 포인터 이벤트를받지 않습니다. man XGrabPointer
이 도움이 될 것입니다.
이벤트를 구독하는 "일반적인"방법은 창에서 XSelectInput()
을 사용하는 것이지만 모든 기존 창의 XSelectInput을 호출해야한다는 점이 문제입니다. 해당 man 페이지를 참조하십시오 ...
xxf86dga 확장에는 마우스와 관련된 몇 가지 호출이 있지만 나는 그들이하는 일을 확신하지 못합니다.
XQueryPointer()
은 다른 창에서 이벤트를 도용하지 않고 포인터 상태를 쿼리하는 또 다른 방법입니다.
내가 생각할 수있는 유일한 다른 곳은 XInput 확장이지만 그 중 하나가 도움이 될지 확신 할 수 없습니다.
는 X11 이벤트를 처리하기에 좋은 참고의
xev
소스 코드를 참조하십시오 XGrabPointer를 사용
http://cgit.freedesktop.org/xorg/app/xev
샘플 코드 :
#include <stdio.h>
#include <assert.h>
#include <X11/Xlib.h>
int main(void)
{
Display *d;
Window root;
d = XOpenDisplay(NULL);
assert(d);
root = DefaultRootWindow(d);
XGrabPointer(d, root, False, ButtonPressMask | ButtonReleaseMask |
PointerMotionMask, GrabModeAsync, GrabModeAsync, None,
None, CurrentTime);
XEvent ev;
while (1) {
XNextEvent(d, &ev);
switch (ev.type) {
case ButtonPress:
printf("Button press event!\n");
break;
case ButtonRelease:
printf("Button release event!\n");
break;
case MotionNotify:
printf("Motion notify event!\n");
break;
default:
printf("Unknown event...\n");
}
}
XCloseDisplay(d);
return 0;
}
사용하여 컴파일을 : gcc x11mouse.c -o x11mouse -lX11
는 "글로벌 마우스 클릭"정의합니다. 애플리케이션의 창 안쪽을 클릭하십시오. 응용 프로그램 창 외부를 포함하여 모든 창 안의 아무 곳이나 클릭하십시오. 원하는 이벤트를 받기 위해 Qt가 구독되어 있습니까? 내 추측에 따르면 필터는 Qt 앱이 수신을 신청 한 이벤트 만 표시합니다 ... – pzanoni