После отображения контекстного меню методом TrackPopupMenu необходимо закрывать это меню по нажатию VK_LEFT. Однако ни в ProcessMessage, ни в PreProcessMessage, при видимом меню, сообщения от клавиатуры попросту не приходят. Если меню не активно — всё нормально все сообщения доходят.
Пробовал смотреть Spy++: он показывает, что message уходит вначале parent Control, затем какому неизвестному Handle (подозреваю, что меню), но мне ничего не приходит.
Программа написанна на C#.
Как это можно вылечить? Или же винда каким-то особенным способом обрабатывает меню и не получиться влезть в этот процесс?
Здравствуйте, Antonovich Aleksei, Вы писали:
AA>После отображения контекстного меню методом TrackPopupMenu необходимо закрывать это меню по нажатию VK_LEFT. Однако ни в ProcessMessage, ни в PreProcessMessage, при видимом меню, сообщения от клавиатуры попросту не приходят. Если меню не активно — всё нормально все сообщения доходят. AA>Пробовал смотреть Spy++: он показывает, что message уходит вначале parent Control, затем какому неизвестному Handle (подозреваю, что меню), но мне ничего не приходит. AA>Программа написанна на C#. AA>Как это можно вылечить? Или же винда каким-то особенным способом обрабатывает меню и не получиться влезть в этот процесс?
Вот есть твой UI-ный поток. В "обычном" режиме он крутится в цикле сообщений, который вызывает всякие PreProcessMessage и пр. Но вот приходит команда отобразить контекстное меню, и поток приходит в обработчик запуска контекстного меню. В обработчике происходит вызов TrackPopupMenu, и поток "уходит" в эту функцию, и не выйдет из нее, пока не закроется меню. Поток крутится в цикле внутри этой функции TrackPopupMenu, который, ессно, не знает о каких-то там PreProcessMessage и пр. и не вызывает их.
Тебе надо повесить хук на свой поток. Только так ты будешь ловить ВСЕ сообщения.
Возможно вместо CBT_MESSAGE надо будет использовать другой код. Просто взял пример из своего кода, давно уже так делал, не помню точно, для чего там нужно было вешать хук на себя.
В процедуру MyHookProc будут приходить все сообщения данного потока.
Просто хуки перехватывают сообщения еще на стадии GetMessage — кто бы ее не вызвал в данном потоке.
RB>Возможно вместо CBT_MESSAGE надо будет использовать другой код. Просто взял пример из своего кода, давно уже так делал, не помню точно, для чего там нужно было вешать хук на себя.
RB>В процедуру MyHookProc будут приходить все сообщения данного потока.
RB>Просто хуки перехватывают сообщения еще на стадии GetMessage — кто бы ее не вызвал в данном потоке.
RB>Возможно вместо CBT_MESSAGE надо будет использовать другой код. Просто взял пример из своего кода, давно уже так делал, не помню точно, для чего там нужно было вешать хук на себя.
RB>В процедуру MyHookProc будут приходить все сообщения данного потока.
RB>Просто хуки перехватывают сообщения еще на стадии GetMessage — кто бы ее не вызвал в данном потоке.
Не работает . Вешал с WH_KEYBOARD_LL — Low Level keystroke — не приходят сообщения.
RB>>Возможно вместо CBT_MESSAGE надо будет использовать другой код. Просто взял пример из своего кода, давно уже так делал, не помню точно, для чего там нужно было вешать хук на себя.
RB>>В процедуру MyHookProc будут приходить все сообщения данного потока.
RB>>Просто хуки перехватывают сообщения еще на стадии GetMessage — кто бы ее не вызвал в данном потоке.
AA>Не работает . Вешал с WH_KEYBOARD_LL — Low Level keystroke — не приходят сообщения.
Сорри работает. Не повесил толком хук.
AA>>>Не работает . Вешал с WH_KEYBOARD_LL — Low Level keystroke — не приходят сообщения. AA>>Сорри работает. Не повесил толком хук.
RB>Ты так не пугай... Я тут чуть с кресла не свалился...
Ок. Я сам уже перепугался — всё что до этого не продовал не работало. Spy++ показывает, что сообщение уходит, а я его не получаю. Мистика какая-то... Уже подумал, что винда это как то хитро обрабатывает...
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, Antonovich Aleksei, Вы писали:
AA>>После отображения контекстного меню методом TrackPopupMenu необходимо закрывать это меню по нажатию VK_LEFT. Однако ни в ProcessMessage, ни в PreProcessMessage, при видимом меню, сообщения от клавиатуры попросту не приходят. Если меню не активно — всё нормально все сообщения доходят. AA>>Пробовал смотреть Spy++: он показывает, что message уходит вначале parent Control, затем какому неизвестному Handle (подозреваю, что меню), но мне ничего не приходит. AA>>Программа написанна на C#. AA>>Как это можно вылечить? Или же винда каким-то особенным способом обрабатывает меню и не получиться влезть в этот процесс?
RB>Вот есть твой UI-ный поток. В "обычном" режиме он крутится в цикле сообщений, который вызывает всякие PreProcessMessage и пр. Но вот приходит команда отобразить контекстное меню, и поток приходит в обработчик запуска контекстного меню. В обработчике происходит вызов TrackPopupMenu, и поток "уходит" в эту функцию, и не выйдет из нее, пока не закроется меню. Поток крутится в цикле внутри этой функции TrackPopupMenu, который, ессно, не знает о каких-то там PreProcessMessage и пр. и не вызывает их.
ну прям так уж и уходит а как же я тогда в том же потоке ловлю WM_RMENUBUTTONUP когда контекстное меню активно?
RB>Тебе надо повесить хук на свой поток. Только так ты будешь ловить ВСЕ сообщения.
C>ну прям так уж и уходит а как же я тогда в том же потоке ловлю WM_RMENUBUTTONUP когда контекстное меню активно?
Уходит, уходит.
В твоем случае это спец. сообщение, которое TrackPopupMenu шлет в окно.
Но это не значит, что она пропускает ВСЕ сообщения через это окно.
C>>ну прям так уж и уходит а как же я тогда в том же потоке ловлю WM_RMENUBUTTONUP когда контекстное меню активно?
RB>Уходит, уходит. RB>В твоем случае это спец. сообщение, которое TrackPopupMenu шлет в окно. RB>Но это не значит, что она пропускает ВСЕ сообщения через это окно.
Не спорю такая мысль при писании мелькала
Но можно по правому клику в этом случае показывать контекстное меню для контекстного меню, собственно как какое либо вообще решение сабжа
C>Не спорю такая мысль при писании мелькала C>Но можно по правому клику в этом случае показывать контекстное меню для контекстного меню, собственно как какое либо вообще решение сабжа
Понял. Тебя ввел в заблуждение сабж.
На самом деле, требовалось другое, я бы сказал, в чем-то обратное, действие...