使用 Mutex 的 C++/CLI 中的单实例应用程序

Posted

技术标签:

【中文标题】使用 Mutex 的 C++/CLI 中的单实例应用程序【英文标题】:Single Instance Application in C++/CLI using Mutex 【发布时间】:2014-09-11 09:30:50 【问题描述】:

我正在 C++ CLI 中开发一个基于托盘图标的应用程序。我正在使用 Mutex 来确保我的应用程序的单个实例一次运行。但是每次新实例启动时,当前实例的窗口都应该处于活动状态。 我正在使用 PostMessage(Pinvoke) 向窗口发送消息。但是连续运行 3 或 4 次后,我的应用程序崩溃了。

任何想法为什么会发生。请帮忙!!

我在main()函数中写的代码是,

Mutex ^mutex = gcnew Mutex(true, "8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F");
if (mutex->WaitOne(TimeSpan::Zero, true))

    // New Instance. Proceed......................

else// An instance is already running. Activate it and return

    // send our Win32 message to make the currently running instance
    // jump on top of all the other windows
    try
    

        HWND hWindow = FindWindow( nullptr, "MyWindow" );
        if(hWindow)
            PostMessage(hWindow, WM_ACTIVATE_APP, nullptr,nullptr);
    
    catch(Exception^ Ex)
    
    
    return -1;

感谢和问候,

罗希尼

【问题讨论】:

添加一些代码会有所帮助。 嗨@AntonSavin Savin,我已经添加了代码 好吧,你在撒谎,告诉应用程序它已激活但实际上并未激活它。这样的谎言有在你的脸上炸开的诀窍。您必须改用 SetForegroundWindow()。请避免重新发明***,这在 .NET 中已经得到很好的支持。使用 WindowsFormsApplicationBase 类、IsSingleInstance 属性和 StartupNextInstance 事件。 感谢@Hans Passant。原谅我的无知。我按照您指出的方式进行了一项小型研究,但我被困在需要使用自定义 ApplicationContext 运行()我的应用程序的地步,对此我在 WindowsFormsApplicationBase 中看不到方法。 非常不清楚为什么您认为需要自定义 ApplicationContext。默认值对每个人都足够好。通常只用于覆盖决定何时退出 UI 线程,WFAB 已经具有该功能。您必须对此提出问题并正确记录。 【参考方案1】:

试试这个而不是PostMessage()

ShowWindowAsync(hWindow, 1); // SW_SHOWNORMAL
SetForegroundWindow(hWindow);

【讨论】:

..谢谢...事情再次变得复杂,因为它不是我应该展示的主要 Winow。我的主窗口只是一个设计用来接收消息的小窗口。正如我已经说过的,这是一个托盘图标应用程序,在每个托盘上下文菜单中,我显示不同的表单,显示的第一个表单取决于用户是否登录到应用程序等。 @RohiniSreekanth 但是你没有找到正确的窗口 FindWindow 如你在帖子中显示的那样?您也可以使用FindWindowEx 搜索子窗口。 FindWindow 和 Postmessage 成功,但它导致了一个问题,因此当我查看任务管理器时,我可以看到我的应用程序的许多实例正在运行,并且在某些时候应用程序崩溃了。

以上是关于使用 Mutex 的 C++/CLI 中的单实例应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Linux 上的单实例 dotnetcore cli 应用程序

用 C++ 编写的单例模式中的一些错误

二十八python中的单例模式

iOS中的单例对象[重复]

一个基于C++11的单例模板类

Linux C 多线程编程之互斥锁与条件变量实例详解