【发布时间】:2015-08-28 03:11:46
【问题描述】:
我使用的是 WinAPI SetWindowsHookEx 和 OS X Objective-c [NSEvent addLocalMonitorForEventsMatchingMask:handler:],它们都设置了回调,然后我无休止地运行事件循环,并在需要时触发回调。
我只将这个钩子插入到我的进程/应用程序中(但如果我也可以在系统范围内进行操作会很酷)。当用户进行鼠标组合时,我会跟踪他们,如果组合匹配特定模式,它会阻止最后一个鼠标事件并执行特定功能。
我想知道 x11 等价物是什么?
我找到了这个话题:X11 Mouse Movement Event
但这似乎可以监视所有事件,而他只是过滤掉了鼠标事件。这也是一种锁定非回调方法,这没关系,因为我正在从专用线程运行此代码。但理想情况下,我更喜欢回调方法,因为我的主线程必须向该线程发送消息,例如关于活动窗口更改的消息,并且如果它卡在一个循环中,它将永远不会放弃获取活动窗口更改消息。
【问题讨论】:
-
This tutorial 将来可能会有用。 Writing callback functions in XLib 在这种情况下可能对您有用。基本上,您处理事件的方式与在 Windows 中的处理方式相同。但是,您手动过滤事件并最终调用特定的回调函数,就像您在 Windows 中的窗口过程中所做的那样。
-
xAttributes.event_mask = ...你应该建立自己的面具,而不是盲目复制示例。 -
@Noitidart 还有 XCB's mouse movement events 而不是 Xlib,但你是对的。您使用常规消息/事件循环来过滤事件并处理输入,而不是添加挂钩,这类似于在 Windows 中的窗口过程中处理
WM_MOUSEMOVE消息。您只需根据需要设置事件掩码,将逻辑移至消息循环。如果您认为这似乎比它应该做的更困难,那么 X 与 Windows 根本不同:X 向服务器发送和接收消息; Windows 没有。 -
使用 pthreads 条件变量。
-
@Noitidart Try it yourself :-) 即使窗口没有输入焦点,也接收到事件,包括点击/点击和移动,尽管它只接收窗口客户区暴露部分的事件,不是隐藏在另一个窗口后面的模糊部分(我的窗口管理器允许我按住 Shift 来单击一个窗口而不给它焦点)。但是,即使离开窗口的客户区,指针拖动仍然存在。因此,您可能会收到额外的
XCB_LEAVE_NOTIFY事件,并且必须对指针拖动进行特殊处理。
标签: x11