使用以下代码:
XGrabPointer(d, root, False, ButtonPressMask
, GrabModeAsync, GrabModeAsync, None,
None, CurrentTime);
我只是用按钮按下事件指定,但是当运行其他应用程序时无法获得任何其他鼠标事件,如鼠标移动。 它是这个功能设计的吗?或者我做错了什么。像参数owner_events一样,我无法理解。
如果owner_events为False,则会针对grab_window报告所有生成的指针事件,并仅在event_mask选择时报告。如果owner_events为True,并且通常会将生成的指针事件报告给此客户端,则会照常报告。否则,将报告有关grab_window的事件,并仅在event_mask选择时报告。对于owner_events的任一值,将丢弃未报告的事件。
解释owner_event,看起来我需要注册两个事件类型:ButtonPressMask | PointerMotionMask和owner_events真的?但这也不起作用。
答案 0 :(得分:3)
密钥位于您发布的描述的最后一句:
对于owner_events的任何一个值,都会丢弃未报告的事件。
即。如果owner_events为True或False则不重要,将丢弃未处理的事件。 owner_events的子节点是事件被传递到的窗口:if owner_events == False 与掩码匹配的所有指针事件被发送到抓取窗口,即使事件在属于您的其他窗口中申请(客户用X的说法);坐标也相对于抓取窗口。如果owner_events ==将True事件报告给应用程序的任何窗口,而不报告给其他应用程序。
XGrabPointer真正抓住所有指针事件,这非常强大。它通常仅用于瞬态(临时)窗口,如弹出窗口,扩展下拉窗口等。原因是跟踪窗口外部的点击,以便您可以关闭瞬态。我已经在颜色选择器弹出窗口中使用了:当用户点击"选择颜色"按钮弹出窗口出现,我做一个XGrabPointer(..False ..),所以我得到所有点击事件。如果用户在我的弹出窗口外单击,则关闭窗口,就好像用户没有做出选择一样。没有XGrabPointer,我不知道发生了这种情况,弹出窗口将一直打开,直到用户点击它为止。弹出窗口关闭时会立即删除XGrabPointer。