В программе создается несколько окон, сообщения которых обрабатываются в отдельных циклах (т.е. сначала создается одно окно, запускается цикл сообщений, затем оно разрушается, цикл выборки сообщений прекращается, программа выполняет некоторые действия, создается другое окно, запускается цикл сообщений и т.д.).
Проблема заключается в том, что когда закрывается одно окно и появляется следующее, то оно чаще всего оказывается не на переднем плане. Каким спсобом можно сделать, что бы окна не прятались под другие?
Пробовал функцию SetForegroundWindow, но в 2000/XP она иногда игнорируется, сообщения WM_ACTIVATE и WM_ACTIVATEAPP не позволяют управлять состояничми.
Здравствуйте, alik_vs, Вы писали:
Попробуйте SetFocus, если это допустимо. Попробуйте, если окно дочернее, родителя помучить. А окна-то чьи, без родителя?
Здравствуйте, ua1zcl, Вы писали:
U>Здравствуйте, alik_vs, Вы писали: U>Попробуйте SetFocus, если это допустимо. Попробуйте, если окно дочернее, родителя помучить. А окна-то чьи, без родителя?
Окна без родителя. И SetFocus не помогает. Интересно, что когда раньше вместо обычных окон (CreateWindowEx) использовал диалоги (DialogBox) ничего подобного не наблюдальсь.
(Похоже, придется перейти к одному циклу выборки сообщений, хотелось бы наверняка знать — поможет ли?)
Здравствуйте, alik_vs, Вы писали:
_>Окна без родителя. И SetFocus не помогает. Интересно, что когда раньше вместо обычных окон (CreateWindowEx) использовал диалоги (DialogBox) ничего подобного не наблюдальсь. _>(Похоже, придется перейти к одному циклу выборки сообщений, хотелось бы наверняка знать — поможет ли?)
Может применить стиль WS_EX_APPWINDOW. Если используется одна на несколько окон оконная процедура, надо опасаться — бывает приходят сообщения не с тем HWND в WM_CLOSE например (W2000).
Здравствуйте, alik_vs, Вы писали:
_>Проблема заключается в том, что когда закрывается одно окно и появляется следующее, то оно чаще всего оказывается не на переднем плане. Каким спсобом можно сделать, что бы окна не прятались под другие? _>Пробовал функцию SetForegroundWindow, но в 2000/XP она иногда игнорируется, сообщения WM_ACTIVATE и WM_ACTIVATEAPP не позволяют управлять состояничми.
Попробуйте добавить WS_EX_TOPMOST,
или так:
invoke SetWindowPos,hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE
(можно и HWND_TOP)
Всем спасибо за помощь, но проблема была в другом месте. Дело было в том, что параллельный поток (я о нем не стал говорить, казалось он тут ни при чем) иногда отображал свои окна, вот тогда окна почему-то и прятались под низ, не могли сами себя отображать поверх.
И решение оказалось простым (если не учитывать реализацию синхронизации потоков) — сделать дескрипторы необходимых окон глобальными, и вызывать SetForegroundWindow при закрытии окна из первого потока применимо к окну, которое обрабатывает сообщения в другом потоке.
А вообще, честно говоря, немного непонятно зачем такие ограничения наложены на SetForegroundWindow? Для удобства пользователя? Или это своеобразная защита от вредносных программ или программ, написанных в "нехорошем" стиле, которые выводят свои окна поверх других? В MSDN толком не объяснили.