我正在使用“Gtkmm”作为窗口管理器编写 FPS(第一人称射击)游戏,我想做“鼠标外观”。因此,我必须“抓住”鼠标指针以将所有鼠标运动事件重定向到我的应用程序窗口。
似乎有三个重载函数可以完成这项工作,我选择了最简单的一个作为开始:
Gdk::GrabStatus Gdk::Window::pointer_grab(bool owner_events, Gdk::EventMask event_mask, guint32 timestamp)
我试图把这个功能放到我的应用程序中,但到目前为止我得到了“糟糕的结果”——它没有做我想要的,它在“Windows”上的行为“不同”,而不是在“Linux”上,等等。 .
所以我会写下我到目前为止所做的事情,但首先,我的目标是什么:“我想将我的应用程序放在一个窗口中,并且希望即使我离开窗口也能够用鼠标进行鼠标查看用鼠标指针”。
所以让我们来看看函数参数:
--> bool owner_events:当我将它设置为“true”时,我只有在窗口内时才会收到事件,但是(更糟糕的是)当我将它设置为“false”时,我没有t 获取任何事件 - 所以我将其设置为 true (更好的选项 :-) )
-->Gdk::EventMask event_mask:应该有我想要捕捉的那些事件。目前,我只对鼠标运动事件感兴趣,所以我只放了"Gdk::POINTER_MOTION_MASK"
-->guint32 时间戳:这个我也不明白,但是当我放纯 "0" 时,抓取状态是好的,因此“GRAB_SUCCESS”(当我尝试将其设置为 1、2 或任何其他数字时,它返回“GRAB_INVALID_TIME”作为抓取状态) - 所以我将其设置为“0”
现在,当我在 Linux 上运行它时,它虽然抓住了指针,当我点击窗口外的某个地方时,它没有反应(因此我的窗口始终保持在顶部,这就是“我想要的”),但是问题就是说,应用程序不会捕获任何事件,或者仅当我在窗口内时(当我将owner_events设置为true时)才捕获它。
而在 Windows 上,情况更糟:当我点击窗口外的某个地方时,它会将我切换到我点击的区域 - 所以这与“不抓取”相同。
有人可以告诉我,我做错了什么,或者给我一个在 Gtkmm 中使用抓取的小例子吗?