如何使用 gtkmm 抓取和隐藏光标?

Posted

技术标签:

【中文标题】如何使用 gtkmm 抓取和隐藏光标?【英文标题】:How to grab and hide cursor using gtkmm? 【发布时间】:2012-07-11 23:27:06 【问题描述】:

我正在尝试使用 gtkmm 编写一个应用程序,我希望它在获得焦点时隐藏鼠标光标。所以我尝试的第一步是当光标位于窗口顶部时隐藏鼠标光标,这是成功的。但是为了防止鼠标在移出窗口时显示出来,然后我通过不断地将鼠标光标移回绘图区域的中心来限制鼠标移动。

为此,我需要知道窗口位置和窗口大小,使用 Gdk::Window::get_position 和 Gdk::Window::get_size 很容易获得。但是,如果窗口被移动,get_position 将不会返回更新的位置,因此我的光标将冻结在错误的位置!

那么有什么办法可以达到我这里想要的效果呢?

【问题讨论】:

如果光标隐藏在您的窗口之外,用户将如何关注另一个应用程序? @ptomato 感谢您的回复,用户可以使用“alt+tab”在应用程序之外切换焦点。切换焦点没什么大不了的,我可以有一个键盘事件来禁用光标抓取。可以以 FPS 游戏为例,在游戏中光标被隐藏并始终居中在窗口中。当您进入游戏菜单时,鼠标会重新出现......我希望这能解决我的问题:) 我必须同意 ptomato,这听起来像是糟糕的 UI。您不应该阻止用户离开您的应用程序窗口。视频游戏通常(通常)仅在全屏模式下执行此操作,以防止鼠标转到其他屏幕或其他屏幕。除此之外,我真的不明白为什么一个窗口应用程序需要这个。 @senshikaze 感谢您的反馈。对于游戏示例,假设您在窗口模式而不是全屏模式下玩暗黑破坏神 3,您可能希望限制鼠标移动到窗口外以防止误点击。就我而言,我正在编写一个游戏,其中将用户的鼠标移动作为输入。因此,我想在游戏进行时禁止光标移出窗口。 【参考方案1】:

只需grab 指针即可。

//pass all events to window apart LEAVE_NOTIFY_MASK 
MainWindow->set_events(GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK | GDK_PROXIMITY_IN_MASK | GDK_PROXIMITY_OUT_MASK | GDK_SUBSTRUCTURE_MASK | GDK_SCROLL_MASK | GDK_TOUCH_MASK | GDK_SMOOTH_SCROLL_MASK | GDK_TOUCHPAD_GESTURE_MASK);
MainWindow->set_modal(true);
auto display = MainWindow->get_display();
auto window = MainWindow->get_window();
auto grabSuccess = display->get_default_seat()->grab(window, Gdk::SEAT_CAPABILITY_ALL, true);
if(grabSuccess != Gdk::GRAB_SUCCESS)

    std::clog<<"grab failed: "<<grabSuccess<<std::endl;

【讨论】:

以上是关于如何使用 gtkmm 抓取和隐藏光标?的主要内容,如果未能解决你的问题,请参考以下文章

如何从隐藏的跨度类 HTML 中抓取链接?

Gtkmm - 隐藏窗口而不关闭应用程序

如何在屏幕抓取中捕获鼠标光标?

如何在 Chrome 中实现抓取光标图标?

Flutter:使用初始值文本时如何隐藏TextField文本指针(光标)(Android)

如何在 QML 中隐藏光标