如何限制我的Windows应用程序以生成进程的单个实例?

我正在开发一个Windows应用程序。 我使用第三方工具创建了一个帮助文件(.chm),我从Windows应用程序中调用它。 单击“ 帮助”菜单项或按F1键显示应用程序时,将成功调用帮助文件。

我面临的问题是,如果我再次单击菜单项或按F1 (当应用程序打开并且我还没有关闭以前的帮助文件时),它会打开另一个帮助文件实例。

让我通过一个例子来说明一点:我希望它就像“纸牌”游戏一样。 无论您按F1内容菜单项多少次,它只显示一个帮助窗口。

我想做像“纸牌”一样的事情。 我不希望创建多个实例。

我希望你理解我的问题。 如果我的查询错误,请告诉我。 我在下面发布了我的代码。

ProcessStartInfo info; Process exeprocess; 

以下代码位于“帮助”菜单项单击事件中。

  private void mnuContents_Click(object sender, EventArgs e) { string ApplicationPath=ConfigurationSettings.AppSettings["HelpFile"].ToString(); info = new ProcessStartInfo(ApplicationPath); //Process.Start(info); exeprocess = Process.Start(info); } 

一个解决方案是:

  1. 让您的应用程序创建系统范围的资源(下面的示例使用Win32互斥锁)

  2. 在生成.chm之前检查资源(我想你可能正在使用ShellExec或某些变体来生成帮助文件。

这是示例代码(在C ++ / Win32代码中):

http://support.microsoft.com/kb/243953

另一种不同的方法是查看当前正在运行的进程是否与您要生成的进程匹配。 以下是此方法的示例代码:

http://www.dotnetperls.com/single-instance-windows-form

你有一个Process对象,所以你应该将它存储在某个地方,并在下次调用help命令时检查它是否仍处于活动状态。 您可以将Process.HasExited用于此目的。 如果它已退出,请通过调用Dispose()清除Process对象,然后启动一个新实例,再将其存储起来。 根据需要重复。

好的,这是启动CHM查看器的代码块:

  private void mnuContents_Click(object sender, EventArgs e) { string ApplicationPath=ConfigurationSettings.AppSettings["HelpFile"].ToString(); info = new ProcessStartInfo(ApplicationPath); //Process.Start(info); exeprocess = Process.Start(info); } 

在exeprocess中有一个名为Id的属性。 您需要在下次用户按F1或菜单键时跟踪该Id。

你需要做一个检查

  private void mnuContents_Click(object sender, EventArgs e) { if (Process.GetProcessById(self.previousId) != null) { string ApplicationPath=ConfigurationSettings.AppSettings["HelpFile"].ToString(); info = new ProcessStartInfo(ApplicationPath); //Process.Start(info); exeprocess = Process.Start(info); self.previousId = exeprocess.Id; } } 

这样的东西会起作用。 如果您想获得想象力,您也可以将已经运行的流程带到前台。

谢谢你的帮助,但我得到了相同的结果..所以我已经改变了我的整个代码..我已经按照这个链接这很容易,非常有帮助..

http://www.helpscribble.com/dotnet.html