WM_KEYDOWN + context menu
От: Antonovich Aleksei Беларусь  
Дата: 01.06.04 15:13
Оценка:
После отображения контекстного меню методом TrackPopupMenu необходимо закрывать это меню по нажатию VK_LEFT. Однако ни в ProcessMessage, ни в PreProcessMessage, при видимом меню, сообщения от клавиатуры попросту не приходят. Если меню не активно — всё нормально все сообщения доходят.
Пробовал смотреть Spy++: он показывает, что message уходит вначале parent Control, затем какому неизвестному Handle (подозреваю, что меню), но мне ничего не приходит.
Программа написанна на C#.
Как это можно вылечить? Или же винда каким-то особенным способом обрабатывает меню и не получиться влезть в этот процесс?
Re: WM_KEYDOWN + context menu
От: rus blood Россия  
Дата: 01.06.04 16:31
Оценка:
Здравствуйте, Antonovich Aleksei, Вы писали:

AA>После отображения контекстного меню методом TrackPopupMenu необходимо закрывать это меню по нажатию VK_LEFT. Однако ни в ProcessMessage, ни в PreProcessMessage, при видимом меню, сообщения от клавиатуры попросту не приходят. Если меню не активно — всё нормально все сообщения доходят.

AA>Пробовал смотреть Spy++: он показывает, что message уходит вначале parent Control, затем какому неизвестному Handle (подозреваю, что меню), но мне ничего не приходит.
AA>Программа написанна на C#.
AA>Как это можно вылечить? Или же винда каким-то особенным способом обрабатывает меню и не получиться влезть в этот процесс?

Вот есть твой UI-ный поток. В "обычном" режиме он крутится в цикле сообщений, который вызывает всякие PreProcessMessage и пр. Но вот приходит команда отобразить контекстное меню, и поток приходит в обработчик запуска контекстного меню. В обработчике происходит вызов TrackPopupMenu, и поток "уходит" в эту функцию, и не выйдет из нее, пока не закроется меню. Поток крутится в цикле внутри этой функции TrackPopupMenu, который, ессно, не знает о каких-то там PreProcessMessage и пр. и не вызывает их.

Тебе надо повесить хук на свой поток. Только так ты будешь ловить ВСЕ сообщения.
Имею скафандр — готов путешествовать!
Re[2]: WM_KEYDOWN + context menu
От: Antonovich Aleksei Беларусь  
Дата: 01.06.04 16:43
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Тебе надо повесить хук на свой поток. Только так ты будешь ловить ВСЕ сообщения.


А можно поподробнее? А то я как-то не понял, как повесить хук на поток.
Re[3]: WM_KEYDOWN + context menu
От: rus blood Россия  
Дата: 01.06.04 17:00
Оценка:
AA>А можно поподробнее? А то я как-то не понял, как повесить хук на поток.

SetWindowsHookEx(CBT_MESSAGE, MyHookProc, NULL, GetCurrentThreadId());


Возможно вместо CBT_MESSAGE надо будет использовать другой код. Просто взял пример из своего кода, давно уже так делал, не помню точно, для чего там нужно было вешать хук на себя.

В процедуру MyHookProc будут приходить все сообщения данного потока.

Просто хуки перехватывают сообщения еще на стадии GetMessage — кто бы ее не вызвал в данном потоке.
Имею скафандр — готов путешествовать!
Re[4]: WM_KEYDOWN + context menu
От: Antonovich Aleksei Беларусь  
Дата: 01.06.04 17:15
Оценка:
Здравствуйте, rus blood, Вы писали:


AA>>А можно поподробнее? А то я как-то не понял, как повесить хук на поток.


RB>
RB>SetWindowsHookEx(CBT_MESSAGE, MyHookProc, NULL, GetCurrentThreadId());
RB>


RB>Возможно вместо CBT_MESSAGE надо будет использовать другой код. Просто взял пример из своего кода, давно уже так делал, не помню точно, для чего там нужно было вешать хук на себя.


RB>В процедуру MyHookProc будут приходить все сообщения данного потока.


RB>Просто хуки перехватывают сообщения еще на стадии GetMessage — кто бы ее не вызвал в данном потоке.


Спасибо . Я надеюсь поможет .
Re[5]: WM_KEYDOWN + context menu
От: rus blood Россия  
Дата: 01.06.04 17:34
Оценка:
AA>Спасибо . Я надеюсь поможет .

100% если правильно подберешь код хука.
Я вспомнил — у меня были модальные диалоги, но суть та же. Нужно было перехватывать сообщения...
Имею скафандр — готов путешествовать!
Re[4]: WM_KEYDOWN + context menu
От: Antonovich Aleksei Беларусь  
Дата: 01.06.04 17:34
Оценка:
Здравствуйте, rus blood, Вы писали:


AA>>А можно поподробнее? А то я как-то не понял, как повесить хук на поток.


RB>
RB>SetWindowsHookEx(CBT_MESSAGE, MyHookProc, NULL, GetCurrentThreadId());
RB>


RB>Возможно вместо CBT_MESSAGE надо будет использовать другой код. Просто взял пример из своего кода, давно уже так делал, не помню точно, для чего там нужно было вешать хук на себя.


RB>В процедуру MyHookProc будут приходить все сообщения данного потока.


RB>Просто хуки перехватывают сообщения еще на стадии GetMessage — кто бы ее не вызвал в данном потоке.


Не работает . Вешал с WH_KEYBOARD_LL — Low Level keystroke — не приходят сообщения.
Re[5]: WM_KEYDOWN + context menu
От: Antonovich Aleksei Беларусь  
Дата: 01.06.04 17:38
Оценка:
Здравствуйте, Antonovich Aleksei, Вы писали:

AA>Здравствуйте, rus blood, Вы писали:



AA>>>А можно поподробнее? А то я как-то не понял, как повесить хук на поток.


RB>>
RB>>SetWindowsHookEx(CBT_MESSAGE, MyHookProc, NULL, GetCurrentThreadId());
RB>>


RB>>Возможно вместо CBT_MESSAGE надо будет использовать другой код. Просто взял пример из своего кода, давно уже так делал, не помню точно, для чего там нужно было вешать хук на себя.


RB>>В процедуру MyHookProc будут приходить все сообщения данного потока.


RB>>Просто хуки перехватывают сообщения еще на стадии GetMessage — кто бы ее не вызвал в данном потоке.


AA>Не работает . Вешал с WH_KEYBOARD_LL — Low Level keystroke — не приходят сообщения.

Сорри работает. Не повесил толком хук.
Re[6]: WM_KEYDOWN + context menu
От: rus blood Россия  
Дата: 01.06.04 17:42
Оценка:
AA>>Не работает . Вешал с WH_KEYBOARD_LL — Low Level keystroke — не приходят сообщения.
AA>Сорри работает. Не повесил толком хук.

Ты так не пугай... Я тут чуть с кресла не свалился...
Имею скафандр — готов путешествовать!
Re[7]: WM_KEYDOWN + context menu
От: Antonovich Aleksei Беларусь  
Дата: 02.06.04 05:59
Оценка:
Здравствуйте, rus blood, Вы писали:


AA>>>Не работает . Вешал с WH_KEYBOARD_LL — Low Level keystroke — не приходят сообщения.

AA>>Сорри работает. Не повесил толком хук.

RB>Ты так не пугай... Я тут чуть с кресла не свалился...

Ок. Я сам уже перепугался — всё что до этого не продовал не работало. Spy++ показывает, что сообщение уходит, а я его не получаю. Мистика какая-то... Уже подумал, что винда это как то хитро обрабатывает...
Re[2]: WM_KEYDOWN + context menu
От: Carc Россия http://www.amlpages.com/home.php
Дата: 02.06.04 16:56
Оценка:
Здравствуйте, 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>Тебе надо повесить хук на свой поток. Только так ты будешь ловить ВСЕ сообщения.
Aml Pages Home
Re[3]: WM_KEYDOWN + context menu
От: rus blood Россия  
Дата: 02.06.04 17:35
Оценка:
C>ну прям так уж и уходит а как же я тогда в том же потоке ловлю WM_RMENUBUTTONUP когда контекстное меню активно?

Уходит, уходит.
В твоем случае это спец. сообщение, которое TrackPopupMenu шлет в окно.
Но это не значит, что она пропускает ВСЕ сообщения через это окно.
Имею скафандр — готов путешествовать!
Re[4]: WM_KEYDOWN + context menu
От: Carc Россия http://www.amlpages.com/home.php
Дата: 02.06.04 18:38
Оценка:
Здравствуйте, rus blood, Вы писали:


C>>ну прям так уж и уходит а как же я тогда в том же потоке ловлю WM_RMENUBUTTONUP когда контекстное меню активно?


RB>Уходит, уходит.

RB>В твоем случае это спец. сообщение, которое TrackPopupMenu шлет в окно.
RB>Но это не значит, что она пропускает ВСЕ сообщения через это окно.
Не спорю такая мысль при писании мелькала
Но можно по правому клику в этом случае показывать контекстное меню для контекстного меню, собственно как какое либо вообще решение сабжа
Aml Pages Home
Re[5]: WM_KEYDOWN + context menu
От: rus blood Россия  
Дата: 03.06.04 08:34
Оценка:
C>Не спорю такая мысль при писании мелькала
C>Но можно по правому клику в этом случае показывать контекстное меню для контекстного меню, собственно как какое либо вообще решение сабжа

Понял. Тебя ввел в заблуждение сабж.
На самом деле, требовалось другое, я бы сказал, в чем-то обратное, действие...
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.