Как вывести окно неуправляемого приложения на передний план и сделать его активным окном для (имитируемого) пользовательского ввода - PullRequest
10 голосов
/ 03 июня 2011

Я предполагаю, что мне нужно использовать pinvoke, но я не уверен, какие вызовы функций необходимы.

Подробный сценарий.Устаревшее приложение будет запущено.У меня будет дескриптор для этого приложения.Мне нужно: а) вывести это приложение наверх (перед всеми остальными окнами).б) Сделать его активным окном.

Какие вызовы функций Windows необходимы?

Ответы [ 3 ]

13 голосов
/ 03 июня 2011

Если у вас нет дескриптора окна, используйте его раньше:

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

Теперь, если у вас есть дескриптор окна приложения:

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

Это будетзаставьте панель задач мигать, если другое окно имеет фокус клавиатуры.

Если вы хотите, чтобы окно выходило вперед, используйте ForceForegroundWindow (пример реализации).

10 голосов
/ 30 января 2012
    [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 используется для отображения свернутого приложения, а метод SetForegroundWindow используется для переноса приложения на задний план.

Вы можете использовать эти методы, как я использовал в моем приложении, чтобы вывести Skype на фронт.моего приложения.при нажатии кнопки

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);
        }
    }
10 голосов
/ 08 июня 2011

Это оказалось чрезвычайно надежным. Функция ShowWindowAsync специально разработана для окон, созданных другим потоком. SW_SHOWDEFAULT проверяет, что окно восстановлено перед его отображением, а затем активацией.

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

Тогда звоните:

ShowWindowAsync(windowHandle, SW_SHOWDEFAULT);
ShowWindowAsync(windowHandle, SW_SHOW);
SetForegroundWindow(windowHandle);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...