Приведение окна на фронт в C # с использованием Win32 API

голоса
35

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

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

Что такое лучший способ пойти по этому поводу? Есть предположения?

Задан 06/08/2008 в 01:55
источник пользователем
На других языках...                            


6 ответов

голоса
14

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

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

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

Ответил 06/08/2008 в 02:06
источник пользователем

голоса
5

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

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

Ответил 06/08/2008 в 14:20
источник пользователем

голоса
2

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

Ответил 24/08/2008 в 22:51
источник пользователем

голоса
2

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

Ответил 06/08/2008 в 02:37
источник пользователем

голоса
1

SetWindowPos + SWP_NOACTIVATE делает работу.

Ответил 18/12/2009 в 08:23
источник пользователем

голоса
0

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

Ответил 06/05/2011 в 15:44
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more