Как вывести на экран другое окно приложения, не активируя его? - PullRequest
7 голосов
/ 10 марта 2011

хочу вывести на передний план окно (из другого приложения).В настоящее время я использую:

::SetWindowPos(hwnd, GetForegroundWindow(), 0, 0, 0, 0, SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);

Работает нормально, но в некоторых (неизвестных мне) случаях окно всегда находится сверху.В соответствии с MSDN, я должен использовать HWND_NOTOPMOST вместо GetForegroundWindow(), но он не работает - окно остается под другими (не всегда сверху) окнами.

Как я могу привести окно кпередний без его активации?

1 Ответ

11 голосов
/ 10 марта 2011

Окно другого приложения можно временно сделать «самым верхним», чтобы вывести его на передний план, не активируя его, сначала указав HWND_TOPMOST как «hWndInsertAfter» в вызове SetWindowPos, а затем указав HWND_NOTOPMOST в второй вызов (оба вызова с SWP_NOACTIVATE в «uFlags»). Если есть риск удалить самый верхний стиль окна, который уже является самым верхним в результате операции, можно предварительно протестировать WS_EX_TOPMOST ex-стиль с помощью вызова GetWindowLong[Ptr].

Если есть конкретное окно, в котором окно другого приложения должно быть впереди (в отличие от того, чтобы быть перед всеми окнами), владелец этого окна может быть снова временно установлен на то окно, которое должно быть впереди. GetWindowLong[Ptr] с GWL_HWNDPARENT можно использовать для сохранения первоначального владельца окна, затем вызов SetWindowLong[Ptr] для установки временного владельца, затем вызов SetWindowPos с HWND_TOP, а затем восстановление первоначального владельца с снова SetWindowLong[Ptr].

...