除了在某些窗口中,以下代码片段大部分时间都有效。 例如,在最新的Ubuntu下,它无法用于选择文件资源管理器中的文件夹。 它似乎适用于其他任何地方,但这种差距很大。 我怀疑它与我如何使用XQueryPointer有关,但我几乎尝试了所有可以找到的例子。 如果我使用计算机的鼠标,它工作正常。 仅供参考:我已经尝试过这些问题的答案: 发送程序化事件 获取鼠标输入,但它们没有任何不同……
这是代码:
#include #include #include void SendClick(int button, int down) { Display *display = XOpenDisplay(NULL); XEvent event; if(display == NULL) { return; } memset(&event, 0, sizeof(event)); event.xbutton.button = button; event.xbutton.same_screen = True; event.xbutton.subwindow = DefaultRootWindow (display); 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); } event.type = down ? ButtonPress : ButtonRelease; XSendEvent(display, PointerWindow, True, down ? ButtonPressMask : ButtonReleaseMask, &event); XFlush(display); XCloseDisplay(display); }
感谢ninjalj上面的评论让我走上正轨。 我不喜欢依赖扩展来实现这一点以及它创建的额外依赖性的想法,但它也是一个非常标准的扩展。 完美的作品……
对于遇到与我相同问题的人,以下代码块替换了之前使用的代码并且运行良好:
#include void SendClick(int button, Bool down) { Display *display = XOpenDisplay(NULL); XTestFakeButtonEvent(display, button, down, CurrentTime); XFlush(display); XCloseDisplay(display); }
矮得多!
对于Ubuntu,不要忘记安装libxtst-dev软件包。 一定要将-lXtst添加到LDFLAGS中。
此链接也很有用:
使用XTest扩展生成X11假鼠标事件https://bharathisubramanian.wordpress.com/2010/04/01/x11-fake-mouse-events-generation-using-xtest/
这是一个链接,解释如何使用XTest扩展来生成假键盘事件:
使用XTest扩展生成X11假密钥事件https://bharathisubramanian.wordpress.com/2010/03/14/x11-fake-key-event-generation-using-xtest-ext/
以上就是c/c++开发分享发送X11点击事件不适用于某些窗口相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/559985.html