【问题标题】:X11: will XGrabPointer prevent other apps from any mouse event?X11:XGrabPointer 会阻止其他应用程序发生任何鼠标事件吗?
【发布时间】:2015-08-20 15:28:56
【问题描述】:

使用以下代码:

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 真的吗?但这也不起作用。

【问题讨论】:

    标签: x11 xlib


    【解决方案1】:

    关键在你发布的描述的最后一句话:

    对于 owner_events 的任一值,未报告的事件将被丢弃。

    即owner_events 是 True 还是 False 无关紧要,未处理的事件将被丢弃。 owner_events 的微妙之处是事件被传递到哪个窗口:如果 owner_events == False all 匹配掩码的指针事件被发送到抓取窗口,即使该事件在属于您的其他窗口中应用程序(X 用语中的客户端);坐标也是相对于抓取窗口的。如果 owner_events == True 事件会报告给您应用程序的任何窗口,但不会报告给其他应用程序。

    XGrabPointer 真的可以抓取所有的指针事件,而且这个功能非常强大。它通常仅用于瞬态(临时)窗口,如弹出窗口、扩展下拉窗口等。原因是跟踪窗口外部的点击,以便您可以关闭瞬态。我在颜色选择器弹出窗口中使用过:当用户单击“选择颜色”按钮时,会出现一个弹出窗口,我执行 XGrabPointer (..False..),所以我得到所有点击事件。如果用户在我的弹出窗口之外单击,我会关闭窗口,就好像用户没有做出选择一样。如果没有 XGrabPointer,我不会知道发生了这种情况,并且弹出窗口将保持打开状态,直到用户单击它。当弹出窗口关闭时,XGrabPointer 会立即被移除。

    【讨论】:

    • 感谢您的回答。我也将它用于弹出菜单。由于我们有一些定制的要求,我们将菜单实现为一个窗口。
    • 我和你在同一个用例中(点击外部并关闭)。所以如果我需要那个鼠标移动事件,我必须抓住它并将消息发送到它真正被消耗的地方,这是唯一的选择吗?
    • 我不确定这是否可行。我认为,如果您尝试使用 XSendEvent() 重新注入 PointerMove 事件,它将再次出现在您的程序中,从而导致循环。当弹出窗口可见时,为什么您需要跟踪菜单窗口外的鼠标移动?
    • 对于简单的鼠标事件观察,并在发生某种组合时阻止鼠标事件,你会推荐除XGrabPointer之外的其他东西吗?或者我应该使用它,但在我的应用程序失去焦点时我应该确保XUngrabPointer
    • 嗯...如果您执行 XGrabPointer,我认为您的应用程序不会失去焦点,因为它接收 all 事件。这意味着点击另一个窗口什么都不做......
    猜你喜欢
    • 2018-06-16
    • 2020-08-23
    • 2010-09-22
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2019-06-11
    • 1970-01-01
    相关资源
    最近更新 更多