Как сфокусировать окно процесса поверх запущенного окна веб-браузера в c #? - PullRequest
0 голосов
/ 28 июня 2018

У меня в Systray работает небольшая программа (агент) Windows Forms. Цель этого агента, написанного в C#, - запускать другие программы, фокусировать их и выводить на первый план.

Этот агент получает команды для запуска других программ из браузера и сообщает ему об успешном запуске. Это означает, что браузер всегда работает и работает.

Запуск внешних программ из агента работает нормально, но у меня много проблем с тем, чтобы заставить работать фокус и приоритетную тему. Похоже, что браузер всегда в фокусе, а программы, запущенные из агента, перемещаются прямо за окном браузера.

Я пробовал следующие методы из User32.dll безуспешно:

  • SetForegroundWindow(IntPtr handle)
  • SwitchToThisWindow(IntPtr hWnd, bool fAltTab)

Странно то, что если я запускаю агент в моей Visual Studio, фокус работает отлично!

Помощь очень ценится, так как я новичок в Windows.

Обновление 1: Я заметил, если, например, окно powershell (может быть что угодно) лежит над окном браузера, фокусировка окна запущенного процесса работает, как и ожидалось.

Обновление 2: Мне удалось получить правильную фокусировку, позвонив по номеру

SetWindowPos(browserProcess.MainWindowHandle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

в окне процесса браузера и

SetWindowPos(process.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);

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

SetWindowPos(browserProcess.MainWindowHandle, process.MainWindowHandle, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);

для переключения порядка Z окна браузера и окна процесса, но безуспешно.

Вопрос : Как я могу переключить Z-порядок процесса браузера и запущенного процесса?

Ответы [ 2 ]

0 голосов
/ 17 июля 2018

Похоже, SendKeys.SendWait("%"); было магией, в которой я нуждался. % - это клавиша ALT.

Из документации LockSetForegroundWindow

Система автоматически разрешает вызовы SetForegroundWindow, если пользователь нажимает клавишу ALT или предпринимает какое-либо действие, которое заставляет систему изменить окно переднего плана (например, щелкнув фоновое окно).

Вызов AllowSetForegroundWindow вернул FALSE, поэтому я не смог установить окно переднего плана. Вызов GetLastError выявил код ошибки ERROR_ACCESS_DENIED. Вызов SendKeys.SendWait("%") до User32dll.SetForegroundWindow(windowHandle) позволяет звонить на SetForegroundWindow, чтобы быть успешным.

Чтобы сложить это, это выглядит так:

var windowHandle = User32dll.FindWindow(null, nameOfWindow);
SendKeys.SendWait("%");
User32dll.SetForegroundWindow(windowHandle);

Если окно свернуто, достаточно использовать User32dll.ShowWindow(windowHandle, User32dll.SW_RESTORE).

0 голосов
/ 28 июня 2018

Как вы получаете дескриптор для этого окна?

Это работает для меня:

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetForegroundWindow(IntPtr hWnd);


    SetForegroundWindow((IntPtr)handle);
...