Вывод окна на передний план в C # с использованием Win32 API - PullRequest
37 голосов
/ 06 августа 2008

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

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

Как лучше всего это сделать? Есть мысли?

Ответы [ 6 ]

15 голосов
/ 06 августа 2008

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

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

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

5 голосов
/ 06 августа 2008

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

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

2 голосов
/ 25 августа 2008

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

2 голосов
/ 06 августа 2008

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

1 голос
/ 18 декабря 2009

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

0 голосов
/ 06 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...