c++ - Gtk应用程序的独特性,无需创建任何窗口

标签 c++ gtk gtkmm

是否可以只运行 GTK 应用程序的一份拷贝而不创建任何窗口?此示例允许您运行该程序的多个拷贝,但我需要强制只允许运行一个拷贝。

#include <gtkmm.h>                                                                                                                                 

int                                                                                                                                                
main(int argc, char** argv)                                                                                                                        
{                                                                                                                                                  
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
    app->hold();

    return app->run();                                                                                                                               
}

如果我添加 GTK 窗口,一切都会按照我的预期运行。即只有一个拷贝正在运行,第二个拷贝刚刚退出。但我的application位于系统托盘中,并且在启动时不会创建任何窗口。

#include <gtkmm.h>                                                                                                                                 

int                                                                                                                                                
main(int argc, char** argv)                                                                                                                        
{                                                                                                                                                  
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");                                                  
    Gtk::Window window;                                                                                                                              

    return app->run(window);                                                                                                                         
}

最佳答案

我对c++不熟悉,但我的建议是你把hold方法放错了。只应保留主要实例。第二个实例启动后,它会为主实例发出“激活”信号。因此,将所有操作放在 g_application_activate 方法中似乎是解决方案。

这就是它与 python 的工作方式,也许这可以帮助

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class Application(Gtk.Application):
    def __init__(self, *args, **kwargs):
        super().__init__(application_id="org.example.myapp")

    def do_activate(self):
        if not hasattr(self, "my_app_settings"):
            self.hold()
            self.my_app_settings = "Primary application instance."
            print(self.my_app_settings)
        else:
            print("Already running!")

app = Application()
app.run()

关于c++ - Gtk应用程序的独特性,无需创建任何窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41883527/

相关文章:

c++ - gtkmm x 事件不工作

c++ - 在安全浏览器 7 (Firefox 29) 上构建失败

lua - 通过 Lua 创建交互式 GTK 界面

用 if 检查 char

c++ - 是否可以使用 gtkmm 定义 GTK+ 类型?

c++ - GTKMM 和 boost.asio

c++ - 为什么在链表中使用指向结构的指针而不是常规的结构类型变量?

c++ - 存储三角函数调用的结果有意义吗?

C++0x 可变参数模板通过引用传递

GTK+ 3 的 Ruby 绑定(bind)?