Вывод окна на передний план в C# с использованием Win32 API

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

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

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

Ответов (6)

Решение

SetForegroundWindow должен украсть фокус, и в некоторых случаях это не удастся.

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

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

SetWindowPos + SWP_NOACTIVATE выполняет эту работу.

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

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

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

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

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