gpt4 book ai didi

x11 - 鼠标事件回调

转载 作者:行者123 更新时间:2023-12-04 16:27:59 26 4
gpt4 key购买 nike

我正在使用 WinAPI SetWindowsHookEx和 OS X 目标-c [NSEvent addLocalMonitorForEventsMatchingMask:handler:]两者都设置了回调,然后我无休止地运行事件循环,回调在需要时触发。

我将这个钩子(Hook)插入到我的进程/应用程序中(但如果我也可以在系统范围内进行操作会很酷)。当用户进行鼠标组合时,我会跟踪他们,如果组合匹配特定模式,它会阻止最后一个鼠标事件并执行特定功能。

我想知道 x11 等价物是什么?

我发现了这个话题:X11 Mouse Movement Event

但这似乎绝对监视所有事件,而他只是过滤掉了鼠标事件。这也是一种锁定非回调方法,这没关系,因为我正在从专用线程运行此代码。但理想情况下,我更喜欢回调方法,因为我的主线程必须向该线程发送消息,例如关于事件窗口更改的消息,并且如果它卡在循环中,它将永远不会放弃获取事件窗口更改消息。

最佳答案

如果您希望它在全局范围内工作,您可能必须为此修补内核。一些背景。

我不确定 OS X,但 Windows 是一个非常不安全的操作系统。例如,每个进程都可以通过 SetWindowsHookEx 安装 Hook 。并监控鼠标和键盘——它基本上是一个键盘记录器。几年前,没有防病毒工具会报告这一点。我不知道今天怎么样。

但从本质上讲,Windows 是一个协作操作系统。这意味着 GUI 运行计算机。具有控制权的应用程序(= 事件的应用程序)获取所有事件。如果应用程序锁定,Windows 将锁定(鼠标和键盘已失效)。如果您在另一个窗口中单击并且事件应用程序显示“否”,则新窗口不会变为事件状态。我记得做了一些事情来让事情变得更好,但这就是 Windows 过去如此不稳定的原因之一——某些应用程序中的一个错误,整个系统变得有错误。

在 Unix 上,内核并不关心 UI(它带有它自己的问题包)。相反,有一个称为 X 服务器的程序(一个正常进程)。从内核的角度来看,这个程序与其他程序没有任何不同。内核处理鼠标和键盘。如果 X 锁定,键盘仍然可以工作(例如,您可以切换到文本控制台)。

这意味着 X 读取像 /dev/input/mice 这样的设备(合并来自当前连接到您计算机的所有鼠标的所有鼠标事件)。您的键盘位于 /dev/input/by-id/ 下方。 .这些设备由内核和 维护。二手 由 X. X 只是这里的一个客户。内核作为控制。

如果一个程序使用 X 库,这意味着它会创建一个到 X 服务器的套接字连接。服务器处理内核设备发送的鼠标和键盘事件。这些变成了XEvent结构并发送给客户端。渲染发生在服务器中,客户端向服务器发送绘图命令。

这使得从 X 客户端控制鼠标和键盘变得很困难——它离源头很远。如果您创建人为事件,它们会被标记为“合成”并且大多数程序会忽略这些 - 它们是安全威胁。

上面列出的设备只能被 root 读取,所以听用户所做的一切也并不容易。

总而言之,如果您想对 X 显示器上的所有程序执行此操作,您将需要以 root 运行的程序。可能还有一个内核模块,它允许您注入(inject)事件并将它们作为 /dev/input/ 下的新事件设备公开.你需要配置 X 来收听你的新设备。即便如此,我认为您不能从其他设备取消事件,只需添加您自己的。

如果您只需要一个应用程序,那么事情就容易多了。首先,您需要为您创建的所有窗口添加一个事件监听器。在处理程序中,您可以分析鼠标移动。使用必要的 Button*Mask*MotionMask位来获取您需要的事件。

如果您不关心安全性,那么您可以让您的应用程序接受合成事件并注入(inject)您的新事件。问题是 X 没有“取消事件”的概念。您也许可以使用事件传播规则来实现您想要的;请参阅本页上的“设备事件的传播”:http://menehune.opt.wfu.edu/Kokua/Irix_6.5.21_doc_cd/usr/share/Insight/library/SGI_bookshelves/SGI_Developer/books/XLib_PG/sgi_html/ch08.html

您可能还应该阅读第 2 章,其中概述了 X。

还有一件事:X 不是线程安全的。你 不得从主线程外部调用 X 函数。如果你这样做,你会得到错误或你的程序会崩溃。

有关的:

  • X11: How do I REALLY grab the mouse pointer?
  • Locking mouse pointer using xGrabPointer in Linux
  • https://tronche.com/gui/x/xlib/event-handling/
  • How to insert synthetic mouse events into X11 input queue
  • 关于x11 - 鼠标事件回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32262767/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com