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

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

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

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

6.08.2008 00:55:48
6 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

17
6.08.2008 01:06:45

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

2
6.08.2008 01:37:37

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

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

5
6.08.2008 13:20:08

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

2
24.08.2008 21:51:34

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

1
18.12.2009 07:23:12

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

0
6.05.2011 14:44:47