Когда установка topmost в окне не работает? - PullRequest
1 голос
/ 08 ноября 2010

У меня есть приложение на C ++, где мне нужно создавать самые верхние окна. Иногда это работает, но довольно часто это терпит неудачу. В одной части приложения я создаю фоновый поток для отображения самого верхнего информационного окна. После того, как пользователь закрывает окно, поток уходит. Когда приложение создает поток и отображает окно в первый раз, оно расположено сверху. Однако все последующие потоки не могут установить самый верхний уровень в своем окне. Я пытался как создать окно со стилем WS_EX_TOPMOST, так и путем вызова SetWindowPos после того, как окно создано. Ни один из этих методов не работает. Я посмотрел и не смог найти никаких ссылок на тех, у кого есть проблема, когда окно не может быть установлено верхним.

В одном из тестов, который я запустил, я вызвал SetWindowPos, и после его возвращения я проверил стиль окна, и он не был установлен как самый верхний, хотя SetWindowPos вернул успех. Я также использовал Spy ++ для проверки стиля окна, и это подтверждает, что стиль не установлен.

Ответы [ 5 ]

1 голос
/ 05 октября 2015

Один из способов, которым SetWindowPos молча не сможет установить WS_EX_TOPMOST, - это когда процесс не имеет разрешения на SetForegroundWindow во время создания окна или вызывается SetWindowPos.Что, возможно, является одним из случаев, когда вам нужно самое верхнее окно (и, возможно, один из случаев, когда вам не разрешено).

Слухи о том, что MS закрыла эту лазейку с Vista,

Ограничение понятно: вы не хотите, чтобы верхние окна из случайных процессов захватывали фокус, когда у них тоже нет бизнеса.

Обходной путь для разумного случая использования, когда один процесс косвенно запускает вспомогательный процесс (как в случае установки, инициированной в родительском процессе, а затем вспомогательный процесс, запущенный из msiexec), а затем помощник хочет быть самым верхним или даже захватить ввод -AllowSetForegroundWindow.

Вы должны иметь право сосредоточиться, чтобы иметь возможность отказаться от него, очевидно.

0 голосов
/ 10 июня 2011

Почему бы вам просто не использовать SetForegroundWindow () . Там намного меньше, чтобы пойти не так ..

0 голосов
/ 08 ноября 2010
SetWindowPos(_hYourWindow, HWND_TOPMOST, 0, 0, 0, 0,
    SWP_ASYNCWINDOWPOS|SWP_NOSIZE|SWP_SHOWWINDOW|SWP_NOMOVE);

Должно работать!

0 голосов
/ 10 июня 2011

Не знаю, была ли у меня такая же проблема, как у вас, но, по крайней мере, у нее были те же симптомы.Решил это, переместив this->TopMost = true с InitializeComponent на Form_Load.

0 голосов
/ 08 ноября 2010

У меня была похожая проблема при использовании Borland C ++ Builder.Я заставил это работать, установив FormStyle в fsStayOnTop после того, как окно было создано и отображеноЯ думаю, что хитрость заключается в том, чтобы сделать это только после того, как окно полностью отображается.

*visibleForm = new TForm3(Form3);
(*visibleForm)->FormStyle = fsStayOnTop;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...