朱朱你堕落了 发表于 2024-7-31 14:41

求助以MFC为例子写个只运行一个实例代码

写在哪个位置,如何写,麻烦把代码发一下,就是只运行一个。用MFC为例子。

比方说,先运行,OK,打开了。再双击运行一下,没有任意提示,就直接退出。

yes2 发表于 2024-7-31 14:42

本帖最后由 yes2 于 2024-7-31 15:00 编辑

BOOL CtestMutexApp::InitInstance()
{
      // 如果一个运行在 Windows XP 上的应用程序清单指定要
      // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
      //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
      INITCOMMONCONTROLSEX InitCtrls;
      InitCtrls.dwSize = sizeof(InitCtrls);
      // 将它设置为包括所有要在应用程序中使用的
      // 公共控件类。
      InitCtrls.dwICC = ICC_WIN95_CLASSES;
      InitCommonControlsEx(&InitCtrls);

      CWinApp::InitInstance();
    HANDLE hObject = CreateMutex(NULL, FALSE, _T("__SINGLE_PROCESS"));// 创建命名互斥量
    if (GetLastError() == ERROR_ALREADY_EXISTS)                                             // 失败退出
    {
      CloseHandle(hObject);
      // AfxMessageBox(_T("程序已经运行!"));
      return FALSE;
    }

      AfxEnableControlContainer();

      // 创建 shell 管理器,以防对话框包含
      // 任何 shell 树视图控件或 shell 列表视图控件。
      CShellManager *pShellManager = new CShellManager;

      // 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题
      CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

      // 标准初始化
      // 如果未使用这些功能并希望减小
      // 最终可执行文件的大小,则应移除下列
      // 不需要的特定初始化例程
      // 更改用于存储设置的注册表项
      // TODO:应适当修改该字符串,
      // 例如修改为公司或组织名
      SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

      CtestMutexDlg dlg;
      m_pMainWnd = &dlg;
      INT_PTR nResponse = dlg.DoModal();
      if (nResponse == IDOK)
      {
                // TODO:在此放置处理何时用
                //“确定”来关闭对话框的代码
      }
      else if (nResponse == IDCANCEL)
      {
                // TODO:在此放置处理何时用
                //“取消”来关闭对话框的代码
      }
      else if (nResponse == -1)
      {
                TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
                TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
      }

      // 删除上面创建的 shell 管理器。
      if (pShellManager != NULL)
      {
                delete pShellManager;
      }
    CloseHandle(hObject);                                                                              // 关闭互斥量句柄。不关也不影响,退出进程会自动回收
      // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
      //而不是启动应用程序的消息泵。
      return FALSE;
}


MFC对话框程序。互斥代码不是一定要放在这里,比如CtestMutexDlg::OnInitDialog应该也是可以的,只要在界面显示出来之前判断并退出就可以

朱朱你堕落了 发表于 2024-7-31 15:02

yes2 发表于 2024-7-31 14:56
BOOL CtestMutexApp::InitInstance()
{
      // 如果一个运行在 Windows XP 上 ...

只要这几行就行了吗?

    HANDLE hObject = CreateMutex(NULL, FALSE, _T("__SINGLE_PROCESS"));// 创建命名互斥量
    if (GetLastError() == ERROR_ALREADY_EXISTS)                                             // 失败退出
    {
      CloseHandle(hObject);
      return FALSE;
    }

yes2 发表于 2024-7-31 15:24

朱朱你堕落了 发表于 2024-7-31 15:02
只要这几行就行了吗?

    HANDLE hObject = CreateMutex(NULL, FALSE, _T("__SINGLE_PROCESS"));// ...

是的。
在退出之前还有一句CloseHandle(hObject); 但是不写也没关系
页: [1]
查看完整版本: 求助以MFC为例子写个只运行一个实例代码