Подтвердить что ты не робот

Перенос окна на передний план в С# с использованием API Win32

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

Каков наилучший способ сделать это с помощью win32 API? Я попробовал SetForeground(), но он всегда крадет фокус и не работает последовательно.

Каков наилучший способ сделать это? Любые мысли?

4b9b3361

Ответ 1

SetForegroundWindow должен украсть фокус, и есть определенные случаи, когда он потерпит неудачу.

Функция SetForegroundWindow помещает поток, который создал указанное окно на переднем плане, и активирует окно. Вход клавиатуры направлен в окно

Перед выполнением вызова попробуйте выполнить фокусировку SetCapture. Также рассмотрите различные способы вывода окна на передний план: SetForeGroundWindow, SetActiveWindow, даже имитируя щелчок мышью, можно сделать это.

Ответ 2

В чем разница между SetForeGroundWindow, SetActiveWindow и BringWindowToTop? Кажется, что все они делают одно и то же.

Согласно MSDN, SetForeGroundWindow активирует окно и направляет на него клавиатуру. Это попытка работать, даже когда ваш процесс находится в фоновом режиме. SetActiveWindow делает то же самое, что и SetForeGroundWindow, но ничего не делает, если ваше приложение не является самым передним приложением. Наконец, BringWindowToTop только выводит окно в начало и не меняет фокус клавиатуры.

Ответ 3

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

Ответ 4

Вы пытались использовать SetWindowPos. Это каноническая функция для перемещения, изменения размера и установки z-порядка в Windows. Существует флаг SWP_NOACTIVATE, который вы можете использовать. Посмотрите http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx. Я не пробовал это в окне, принадлежащем другому процессу, но, вероятно, стоит попробовать.

Ответ 5

SetWindowPos + SWP_NOACTIVATE выполняет задание.

Ответ 6

Вы можете использовать FindWindow для получения HWND окна, а затем использовать функцию BringWindowToTop, найденную в Win32 API.