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

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 application.

I need to:

  1. bring that application to the top (in front of all other windows)
  2. make it the active window

Which Windows function calls are needed?


Solution 1:

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).

Solution 2:

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

Solution 3:

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