以下是完全正确运行的代码。 如果应用程序已经运行,它的最大化/恢复应用程序或显示在前面..工作完美,但现在的问题是窗口最小化到系统托盘。
this.showInTaskbar = false;
this.WindowState = System.Windows.WindowState.Minimized;
它没有恢复应用程序,我该怎么办?使其从系统托盘恢复/最大化?
[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern Boolean ShowWindow(IntPtr hWnd, Int32 nCmdShow);
private const int SW_SHOWMAXIMIZED = 1;
public NewDesign(){
InitializeComponent();
if (!EnsureSingleInstance()){
System.Environment.Exit(0);
}
}
static bool EnsureSingleInstance()
{
Process currentProcess = Process.GetCurrentProcess();
var runningProcess = (from process in Process.GetProcesses()
where
process.Id != currentProcess.Id &&
process.ProcessName.Equals(
currentProcess.ProcessName,
StringComparison.Ordinal)
select process).FirstOrDefault();
if (runningProcess != null)
{
ShowWindow(runningProcess.MainWindowHandle, SW_SHOWMAXIMIZED);
SetForegroundWindow(runningProcess.MainWindowHandle);
return false;
}
return true;
}
答案 0 :(得分:2)
简单的方法是从C#项目引用Microsoft.VisualBasic
运行时,从WindowsFormsApplicationBase
派生一个应用程序类(即使在C#中也可以这样做),在其上设置IsSingleInstance = true
,并处理StartupNextInstance
事件。在某些情况下不起作用,但适用于常见情况。
更为惯用的C#方式可以在this old chestnut中找到,它落在时间之下并且必须使用Wayback Machine进行挖掘:使用命名管道与已经运行的实例交谈。甚至可以在那里使用一些代码。