使用 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 中的单实例应用程序的主要内容,如果未能解决你的问题,请参考以下文章