好的,所以我创建了我的c#应用程序,为它创建了一个安装程序,并在我的机器上安装了它。
问题是,当用户打开应用程序exe两次时,将运行两个应用程序实例。我只想要一个应用程序的一个实例随时运行,我该怎么做呢?
感谢您的帮助,
答案 0 :(得分:9)
这方面的常用技巧是创建一个名为Mutex
并检查它在应用程序启动时的存在。
来自DDJ的代码:
class App : Form
{
Mutex mutex;
App()
{
Text = "Single Instance!";
mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX");
if (!mutex.WaitOne(0, false))
{
mutex.Close();
mutex = null;
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
mutex.ReleaseMutex();
base.Dispose(disposing);
}
static void Main()
{
App app = new App();
if (app.mutex != null) Application.Run(app);
else MessageBox.Show("Instance already running");
}
}
答案 1 :(得分:8)
我通过这个解决了这个问题
[STAThread]
static void Main()
{
Process[] result = Process.GetProcessesByName("ApplicationName");
if (result.Length > 1)
{
MessageBox.Show("There is already a instance running.", "Information");
System.Environment.Exit(0);
}
// here normal start
}
这很简单,但我没有时间检查更好的解决方案。
答案 2 :(得分:4)
static void Main()
{
using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) {
if (!mutex.WaitOne(0, false)) {
string processName = GetProcessName();
BringOldInstanceToFront(processName);
}
else {
GC.Collect();
Application.Run(new Voting());
}
}
}
private static void BringOldInstanceToFront(string processName) {
Process[] RunningProcesses = Process.GetProcessesByName(processName);
if (RunningProcesses.Length > 0) {
Process runningProcess = RunningProcesses[0];
if (runningProcess != null) {
IntPtr mainWindowHandle = runningProcess.MainWindowHandle;
NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED);
NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE);
}
}
}
答案 3 :(得分:1)
答案 4 :(得分:0)
我不知道您正在操作的环境,但要记住“单实例应用程序”的一个方面是如何定义单实例。如果应用程序可以使用通用数据源同时在多个工作站上运行,那么这是一个问题吗?同样,对于多个用户登录到同一台计算机的终端服务情况(或“运行情况”),您是否希望以每个用户只有一个实例的方式限制应用程序-电脑?或者你只是每个用户只有一个实例吗?
这些问题的答案可能会导致你朝着另一个方向发展。例如,我们有一个“单实例”应用程序,其范围是一组计算机。在该组工作站中只允许一个用户。我们通过在共享数据源中有一个表来跟踪当前连接的用户来管理此操作。这是一个维护问题,因为您需要确保该表始终100%准确。处理工作站上意外停电等事情,在该表中留下“伪造”记录需要小心处理。