How To Give Back Focus From Console Window in C#?

c#, console, focus, user-interface, winapi

Solution

// this should do the trick....

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

private void FocusProcess(string procName)
{
    Process[] objProcesses = System.Diagnostics.Process.GetProcessesByName(procName);
    if (objProcesses.Length > 0)
    {
        IntPtr hWnd = IntPtr.Zero;
        hWnd = objProcesses[0].MainWindowHandle;
        ShowWindowAsync(new HandleRef(null,hWnd), SW_RESTORE);
        SetForegroundWindow(objProcesses[0].MainWindowHandle);
    }
}

Problem

I have a C# console application (A) that opens with the black windows console. Sometimes at startup it steals the focus from another program (B) that needs the focus. Question: How can I give focus back from `A.exe` to `B.exe` ? ``` A -> Focus -> B ``` Details: - Program B is not mine and I can't do anything about it. It has a GUI, multiple windows and 1 of them needs the focus (it might be a modal dialog window). - Program A doesn't need any focus and it doesn't interact in any way with program B. - Program A starts via Startup shortcut and runs basically in background (it is released but still in development though, that's why console window) - I have a few moments/up to minutes to check and give the focus back.

Original source