How do I bring an unmanaged application window to front, and make it the active window for (simulated) user input

后端 未结 3 892
滥情空心
滥情空心 2020-12-03 14:27

I am assuming I need to use pinvoke but I am not sure which function calls are needed.

Scenario: a legacy application will be running, I will have Handle for that ap

相关标签:
3条回答
  • 2020-12-03 15:07

    This has proved to be extremely reliable. The ShowWindowAsync function is specifically designed for windows created by a different thread. The SW_SHOWDEFAULT makes sure the window is restored prior to showing, then activating.

        [DllImport("user32.dll", SetLastError = true)]
        internal static extern bool ShowWindowAsync(IntPtr windowHandle, int nCmdShow);
    
        [DllImport("user32.dll", SetLastError = true)]
        internal static extern bool SetForegroundWindow(IntPtr windowHandle);
    

    Then making the calls:

    ShowWindowAsync(windowHandle, SW_SHOWDEFAULT);
    ShowWindowAsync(windowHandle, SW_SHOW);
    SetForegroundWindow(windowHandle);
    
    0 讨论(0)
  • 2020-12-03 15:15

    If you don't have a handle to the window, use this before :

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    

    Now assuming you have a handle to the application window :

    [DllImport("user32.dll", SetLastError = true)]
    static extern bool SetForegroundWindow(IntPtr hWnd);
    

    This will make the taskbar flash if another window has keyboard focus.

    If you want to force the window to come to the front, use ForceForegroundWindow (sample implementation).

    0 讨论(0)
  • 2020-12-03 15:28
        [DllImport("user32.dll")]
        public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow);
        [DllImport("user32.dll")]
        public static extern bool SetForegroundWindow(IntPtr WindowHandle);
        public const int SW_RESTORE = 9;
    

    ShowWindowAsync method is used to show the minimized application and SetForegroundWindow method is used to bring on front the back application.

    you can use these methods as i used in my application to bring the skype infront of my application. on button click

    private void FocusSkype()
        {
            Process[] objProcesses = System.Diagnostics.Process.GetProcessesByName("skype");
            if (objProcesses.Length > 0)
            {
                IntPtr hWnd = IntPtr.Zero;
                hWnd = objProcesses[0].MainWindowHandle;
                ShowWindowAsync(new HandleRef(null,hWnd), SW_RESTORE);
                 SetForegroundWindow(objProcesses[0].MainWindowHandle);
            }
        }
    
    0 讨论(0)
提交回复
热议问题