鼠标事件回调

时间:2015-08-28 03:11:46

标签: x11

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

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

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

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

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

1 个答案:

答案 0 :(得分:4)

如果您希望全局工作,您可能需要为此修补内核。一些背景。

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

但核心是,Windows是一个合作的操作系统。这意味着GUI运行计算机。具有控制权的应用程序(=活动的应用程序)获取所有事件。如果应用程序锁定,Windows会锁定(鼠标和键盘已死)。如果您在另一个窗口中单击并且活动应用程序显示"否",则新窗口不会变为活动状态。我记得有些事情是为了让事情变得更好,但这也是Windows过去如此不稳定的原因之一 - 某些应用程序中的一个错误,整个系统都变得越来越多。

在Unix上,内核并不关心用户界面(它附带了自己的问题)。相反,有一个称为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函数。如果您这样做,您将收到错误,否则您的程序将崩溃。

相关: