Вопрос нетривиальный.
Есть форма. Она может быть как в активном состоянии, так и в неактивном, за другими окнами. Или вообще свернута. Не суть важно.
В форме хук на события мыши. По определенному событию вызывается PopUp Menu. Если форма активна, то при нажатии на нее или переходе в другое приложение менюшка исчезает.
А вот если менюшка появилась при неактивной форме, то она остается висеть пока не активизируешь форму или пока не выберешь в ней пункт.
Никто не сталкивался с такой проблемой? Как ее можно решить?
Перелопатил массу материала на тему Popup, но дельных мыслей решения проблемы не обнаружил.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
07-04-2019 23:41
Ваша проблема идентична той, что происходит при всплывании меню в трее. Решается: https://stackoverflow.com/questions/4145561/system-tray-context-menu-doesnt-disappear
И да, использование TrackPopupMenu или просто Popup компонента существенной разницы не даёт. SetForegroundWindow - обязателен, даже если окно скрытое. Скрывает менюшку как раз PostMessage, который вроде как ничего не делает, но нужен.
Могу сказать, что неоднократно видел подобные подвисшие меню в других приложениях - появляются при затыках при показе окон. Значит, проблема в том, что какое-то (весьма редкое) сочетание условий приводит систему в неадекватное состояние. Хотя и не смертельное.
Рекомендация - активизировать форму перед показом меню. Это и логично было бы - раз показывается меню, привязанное к форме, значит, что-то сделали в форме, следовательно, форма должна быть активна.
Второй вариант - попробовать вызывать меню через системный TrackPopupMenuEx. В нем есть 5-й параметр - хэндл окна. Туда можно передать хэндл любого окна (но тогда ловить сообщения меню самостоятельно) или же PopupList.Window - стандартное окно-ловушку.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.