当有人将这段代码作为running only a single instance of an application的解决方案进行投票而没有说明他们为什么会这样做时,我很好奇。
int hWnd = FindWindow(null, "My Application Title");
if (hWnd > 0) //If found
{
Process.GetCurrentProcess().WaitForExit(600);
try
{
SetForegroundWindow(hWnd); //Activate it
ShowWindow(hWnd, 9);
Process.GetCurrentProcess().Kill();
}
catch (Exception ex)
{
//write to log
}
}
//Import the FindWindow API to find our window
[DllImport("User32.dll")]
public static extern int FindWindow(String ClassName, String WindowName);
//Import the SetForeground API to activate it
[DllImport("User32.dll")]
public static extern IntPtr SetForegroundWindow(int hWnd);
//Import the ShowWindow API to show it
[DllImport("User32.dll")]
public static extern bool ShowWindow(int hWnd, int nCmdShow);
有人可以向我解释这种方法的缺点吗?感谢。
答案 0 :(得分:4)
因为如果应用程序启动两次(意外点击),则会有一个小的时间窗口,测试将失败。这两个实例都可能正在启动但尚未创建窗口。
答案 1 :(得分:1)
据我所知,缺点是它应该是一个简单的解决方案过于复杂。你不需要破解windows api来强制api的单个实例。我猜这就是你投票的原因。
如果您按照Uwe的答案中的链接进行操作,您将看到您可以保留托管代码,这应该是您的默认代码,除非您有某种原因必须深入挖掘。