1

我有一个QApplication我有一个自定义的QDialog. 该对话框为用户提供了一组选项,然后通过QProcess. 虽然启动的进程仍在运行,但如果关闭,应用程序仍必须运行。为了实现这一点,我根据进程是否启动重新实现了closeEventofQWidgetaccept()ed 或ed 事件。ignore()

closeEvent()函数中,我隐藏了我的QDialog. 这样,对于用户,应用程序将关闭(但它将在任务管理器中运行)。我希望用户通过再次运行程序来重新启动应用程序。在这一点上,我需要弄清楚另一个实例已经在运行并且该实例应该出现在前台。

谁能帮助我如何实现这一目标?

4

2 回答 2

2

命名互斥量可以用来解决。

这篇文章很有帮助。

WINAPI WinMain(
  HINSTANCE, HINSTANCE, LPSTR, int)
{
  try {
    // Try to open the mutex.
    HANDLE hMutex = OpenMutex(
      MUTEX_ALL_ACCESS, 0, "MyApp1.0");

    if (!hMutex)
      // Mutex doesn’t exist. This is
      // the first instance so create
      // the mutex.
      hMutex = 
        CreateMutex(0, 0, "MyApp1.0");
    else
      // The mutex exists so this is the
      // the second instance so return.
      return 0;

    Application->Initialize();
    Application->CreateForm(
      __classid(TForm1), &Form1);
    Application->Run();

    // The app is closing so release
    // the mutex.
    ReleaseMutex(hMutex);
  }
  catch (Exception &exception) {
    Application->
      ShowException(&exception);
  }
  return 0;
}
于 2014-03-14T04:44:49.513 回答
2

在 Qt 5 之前,有一个名为 QtSingleApplication 的项目,它只允许一个应用程序实例运行,并且如果用户试图打开另一个应用程序,它将引发正在运行的应用程序。

如果您在 Google 上搜索“qtsingleapplication qt5”,您将找到更多关于修复 QtSingleApplication 以与 Qt5 一起使用的信息。

这个线程也可能有帮助。

于 2014-03-13T13:50:06.740 回答