You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GTKMM 4中实现第二显示器全屏显示?

GTK4 C++ 获取第二显示器并全屏窗口的问题

需求

拥有一个继承自Gtk::Window的窗口,希望调用fullscreen_on_monitor(const Glib::RefPtr<Gdk::Monitor> &monitor)方法,让窗口在第二显示器上全屏显示,但不知道如何正确获取第二显示器的对象实例。

尝试代码及错误

尝试过以下代码:

Glib::RefPtr<Gio::ListModel> ptr = get_display()->get_monitors();
fullscreen_on_monitor((Gdk::Monitor*) ptr->get_object(1).get());

运行时出现错误:
Cannot cast 'Glib::ObjectBase *' to 'Gdk::Monitor *' via virtual base 'Glib::ObjectBase'

此前误以为Gdk::Monitor并非Glib::ObjectBase的子类,但实际是错误使用了C风格强制类型转换,而非Glib对象系统提供的安全转换方式。

已知替代方法的局限

了解到Display::get_monitor_at_surface()方法,但该方法要求窗口表面已经处于目标显示器上,无法满足直接将窗口全屏到第二显示器的需求。

解决方案

在GTK4的C++绑定中,需要使用Glib提供的动态转换方法将Glib::Object安全转换为Gdk::Monitor,而非强制类型转换。示例代码如下:

// 获取显示器列表
Glib::RefPtr<Gio::ListModel> monitors = get_display()->get_monitors();

// 确保存在第二台显示器(索引从0开始)
if (monitors->get_n_items() > 1) {
    // 获取索引为1的显示器对象(第二台)
    Glib::RefPtr<Glib::Object> monitor_obj = monitors->get_object(1);
    // 动态转换为Gdk::Monitor类型
    Glib::RefPtr<Gdk::Monitor> second_monitor = Glib::RefPtr<Gdk::Monitor>::cast_dynamic(monitor_obj);
    
    if (second_monitor) {
        // 在第二显示器全屏窗口
        fullscreen_on_monitor(second_monitor);
    }
}

同类Rust问题思路参考

Rust语言中存在同类问题:如何将glib::Object转换为gdk::Monitor,对应的解决思路是使用downcast_ref()方法完成安全转换,原理与C++的cast_dynamic一致。

内容的提问来源于stack exchange,提问作者mltm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:52:36