x11을 통해 우분투 용 간단한 마우스 리모콘을 작성하려고합니다. (모질라가 너무 잘 작동과 함께)XTestFakeButtonEvent와 XSendEvent의 차이점
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
void mouseClick(int button)
{
Display *display = XOpenDisplay(NULL);
XEvent event;
if(display == NULL)
{
std::cout << "clicking error 0" << std::endl;
exit(EXIT_FAILURE);
}
memset(&event, 0x00, sizeof(event));
event.type = ButtonPress;
event.xbutton.button = button;
event.xbutton.same_screen = True;
XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
event.xbutton.subwindow = event.xbutton.window;
while(event.xbutton.subwindow)
{
event.xbutton.window = event.xbutton.subwindow;
XQueryPointer(display, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
}
if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0)
std::cout << "clicking error 1" << std::endl;
XFlush(display);
event.type = ButtonRelease;
event.xbutton.state = 0x100;
if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0)
std::cout << "clicking error 2" << std::endl;
XFlush(display);
XCloseDisplay(display);
}
이 코드는 크롬을 제외한 모든 응용 프로그램에 잘 작동 :
먼저 들어 내가 클릭 절차 (XSendEvent 기준) 첫 번째 변종을 썼다. 그래서 내가 (XTestFakeButtonEvent 기준) 두 번째 변형 썼다 :#include <X11/extensions/XTest.h>
void SendClick(int button, Bool down)
{
Display *display = XOpenDisplay(NULL);
XTestFakeButtonEvent(display, button, down, CurrentTime);
XFlush(display);
XCloseDisplay(display);
}
을 그리고이 코드는 잘 everyvere 크롬을 포함 작동합니다. 이러한 기능의
콜링은
// XSendEvent variant
mouseClick(1);
// XTestFakeButtonEvent variant
SendClick(1, true); // press lmb
SendClick(1, false); // release lmb
1 매우 간단하다 : 내가 잘못 이해하는 데 도움이 첫 번째 변종에 (또는 어쩌면 크롬에서 무슨 일).
1 1.1 : 나는 XOpenDisplay (NULL);로 디스플레이를 열 때 필요한 윈도우가 아닌 이벤트를 보내려고한다고 생각합니다. 크롬은 x11 서버와 다른 연결 시스템을 가지고 있습니까?
2 : 응용 프로그램에서 두 번째 변형을 사용하는 것이 좋습니까? 그것은 꽤 짧고 내가 가진 모든 애플 리케이션과 잘 작동)
추신. 이 코드를 컴파일하려면 -lX11 -lXtst libs를 추가하십시오.
Thx man. XSendEvent는 활성 창뿐만 아니라 어떤 창에서도 클릭을 보낼 수 있기 때문에 크롬은 안티 크리커 보호 기능을 사용할 수 있으며 XSendEvent를 사용할 수는 없으므로 사용자가 이것을 보지 않는 동안 비활성 창에서 클릭을 할 수 있습니다. 또한 나는 xdotool의 소스 코드를 보았다.다른 경우 CURRENTWINDOW 및 XSendEvent를 클릭하면 _xdo_mousebutton이 XTestFakeButtonEvent를 사용합니다. – goldstar