鼠标事件回调

Noi*_*art 4 x11

我使用的是 WinAPISetWindowsHookEx和 OS X Objective-c [NSEvent addLocalMonitorForEventsMatchingMask:handler:],它们都设置了回调,然后我无休止地运行事件循环,并且回调在需要时触发。

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

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

我找到了这个话题:X11 Mouse Movement Event

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

Aar*_*lla 5

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

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

但从本质上讲,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内核模块运行的程序,它可能允许您注入事件并将它们作为新的事件设备暴露在/dev/input/. 你需要配置 X 来监听你的新设备。即便如此,我认为您无法从其他设备取消事件,只需添加您自己的设备即可。

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

如果您不关心安全性,那么您可以让您的应用程序接受合成事件并只注入您的新事件。问题是 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函数。如果你这样做,你会得到错误或者你的程序会崩溃。

有关的: