Я пишу приложение, которое должно вывести окно внешнего приложения на передний план и не обязательно красть фокус (есть настройка, которую пользователь может переключать, чтобы красть / не красть фокус).
Каков наилучший способ сделать это с помощью Win32 API? Я пробовал SetForeground (), но он всегда крадет фокус и не работает последовательно.
Каков наилучший способ сделать это? Есть предположения?
SetForegroundWindow, как предполагается, крадет фокус, и есть определенные случаи, когда это потерпит неудачу.
Функция SetForegroundWindow помещает поток, который создал указанное окно, на передний план и активирует окно. Ввод с клавиатуры направлен на окно
Попробуйте захватить фокус с помощью SetCapture перед выполнением вызова. Также обратите внимание на различные способы вывода окна на передний план: SetForeGroundWindow, SetActiveWindow, даже симуляция щелчка мышью может сделать это.
Вы можете попробовать функцию 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 . Я не пробовал это в окне, принадлежащем другому процессу, но, вероятно, стоит попробовать.
SetWindowPos + SWP_NOACTIVATE выполняет свою работу.
Вы можете использовать FindWindow, чтобы получить HWND окна, а затем использовать функцию BringWindowToTop, найденную в Win32 API.