最大化已经运行的窗口C#

时间:2013-07-30 20:00:33

标签: c#

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

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

1 个答案:

答案 0 :(得分:2)

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

更为惯用的C#方式可以在this old chestnut中找到,它落在时间之下并且必须使用Wayback Machine进行挖掘:使用命名管道与已经运行的实例交谈。甚至可以在那里使用一些代码。