1

下面是完美运行的代码。如果应用程序已经在运行,它的最大化/恢复应用程序或在前面显示它.. 工作完美,但现在问题是当窗口最小化到系统托盘时。

 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;
    }
4

1 回答 1

2

最简单的方法是从 C# 项目中引用Microsoft.VisualBasic运行时,从中派生应用程序类WindowsFormsApplicationBase(即使在 C# 中也可以这样做),IsSingleInstance = true在其上设置并处理StartupNextInstance事件。在某些情况下不起作用,但适用于常见情况。

一种更惯用的 C# 方法可以在这个旧栗子中找到,它落在时间的沙子下,必须使用 Wayback Machine 进行挖掘:使用命名管道与已经运行的实例对话。您甚至可以在那里使用一些代码。

于 2013-07-30T20:17:55.133 回答