是否可以只运行一个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);
}
答案 0 :(得分:1)
我不熟悉c ++,但我的建议是你把hold方法弄错了。只应保留主要实例。第二次实例启动后,它会激活&#39;主要实例的信号。因此,将所有操作放在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()
答案 1 :(得分:-1)
只需创建一个GApplication(由gio提供)而不是GtkApplication(由GTK提供)。我指的是C API,但GTKmm应该有一个等价物。
从该页面开始:
GApplication(可选)提供的另一个功能是流程 独特之处。应用程序可以使用此功能 提供唯一的应用程序ID。如果给出,只有一个应用程序 此ID可以在每个会话中一次运行。会议的概念是 平台相关,但大致对应于图形桌面 登录。当您的应用程序再次启动时,它的参数是 通过平台通信传递给已经运行的程序。 已经运行的程序实例称为&#34; primary 实例&#34 ;;对于非独特的应用程序,这始终是当前的 实例。在Linux上,D-Bus会话总线用于通信。