Bring another processes Window to foreground when it has ShowInTaskbar = false

前端 未结 3 1964
有刺的猬
有刺的猬 2020-11-29 01:26

We only want one instance of our app running at any one time. So on start up it looks to see if the app is running and if it is, it calls SetForegroundWindow

相关标签:
3条回答
  • 2020-11-29 01:43
    FindWindow(null, title);
    

    Will find the first window that matches the query. This may lead to unexpected behavior if another window uses the same title.

    Although the chances of this to happen may seem rare or impossible (single instance application) this can easily occur. The windows explorer for instance uses the name of the selected directory as window title (although invisible). Now if the window title is a common term or matches the name of the application directory this can be an issue.

    0 讨论(0)
  • 2020-11-29 01:47

    Well, code is here. Even if the ShowInTaskBar is false, you should be able to bring it to the front.

        [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
        public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
    
        [DllImport("USER32.DLL")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
    
        public static void bringToFront(string title) {
            // Get a handle to the Calculator application.
            IntPtr handle = FindWindow(null, title);
    
            // Verify that Calculator is a running process.
            if (handle == IntPtr.Zero) {
                return;
            }
    
            // Make Calculator the foreground application
            SetForegroundWindow(handle);
        }
    

    Note: you should FindWindow using the form's class and not by name as the splash screen forms sometimes do not have titles or even the controlbox. Use Spy++ to dig deeper.

    Use FindWindow on splash. I think this is what you want to do - bring the splash screen in front while loading of the main form.

    0 讨论(0)
  • 2020-11-29 01:53

    I think this is the better solution because its restores from minimized state:

    public static class WindowHelper
    {
        public static void BringProcessToFront(Process process)
        {
            IntPtr handle = process.MainWindowHandle;
            if (IsIconic(handle))
            {
                ShowWindow(handle, SW_RESTORE);
            }
    
            SetForegroundWindow(handle);
        }
    
        const int SW_RESTORE = 9;
    
        [System.Runtime.InteropServices.DllImport("User32.dll")]
        private static extern bool SetForegroundWindow(IntPtr handle);
        [System.Runtime.InteropServices.DllImport("User32.dll")]
        private static extern bool ShowWindow(IntPtr handle, int nCmdShow);
        [System.Runtime.InteropServices.DllImport("User32.dll")]
        private static extern bool IsIconic(IntPtr handle);
    }
    

    Simple call:

    WindowHelper.BringProcessToFront(process);
    
    0 讨论(0)
提交回复
热议问题