Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > Перехват Windows сообщений для Console окна. |
Автор: TuXAPuK 29.4.2006, 15:36 |
Вобщем занемаюсь я програмированием серверов много чего изпытывал но всеравно лучше старой доброй консоли нечего не нашол. К сожелению дошол я до такого момента когда консоли мне окозалось мало, но от старого удобного движка отказыватся я некак не хотел. Вот я и решил извратится по полной с помощью ResHack'а создал ресурс, в нём меню. И через винапи прилепил меню к консольному окну. AllocConsole, Repaint и вот долгожданное меню уже прилеплено. Но тут я встал как вкопанный и обзадался вопросом а как-же поймать сообщение от меню?? ![]() С уважением Евгений a.k.a. TuXAPuK ![]() |
Автор: Quadr0 29.4.2006, 16:45 |
... |
Автор: TuXAPuK 2.5.2006, 17:45 | ||
В этом вся суть проблемы. В том что мне не нужна ещё одна форма с менюшкой, и не желательна реализация при помощи крюка (hook). Так как в первом случее пользователю будет не удобно искать а где-же это окошко с менюшкой там пропало.. А во втором случее прийдётся использовать DDE сервер/клиент что-бы передовать сообщения от крюка (hook) к консоли, а через SendMessage на HWND консоли я тоже нечего сделать немогу. Вот мой сокращённый Пример:
с Картинкой: Где мы: 1) Устанавливаем Caption для консоли. 2) Заставляем Windows покозать наше окошко и создать для него все заголовки. 3) Устанавливаем меню к нашей консоли загруженное из собственного ресурса с RESNAME = '128' Пологаю вопрос остаётся в силе: Каким образом получить сообщения от своего меню? ![]() С уважением Евгений a.k.a. TuXAPuK |
Автор: Snowy 2.5.2006, 19:38 | ||
Могет такой вариант подойдет?
|
Автор: Rouse_ 3.5.2006, 12:27 | ||
Смотреть нужно примерно в эту сторону:
К сожалению сабкласинг консоли не проходит, а было бы проще на много... |
Автор: Snowy 3.5.2006, 12:32 |
Можно конечно "тут думать". Только консоль нам не говорит, какой пункт меню был выбран... Мы узнаем только о раскрытии и закрытии меню. Это вообще может быть не наше меню, а системное. Можно попробовать думать в сторону событий меню. Например следить за отрисовкой и фиксировать последний выбранный пункт... Извращение конечно. Можно попробовать хук на выбор пункта меню. Простого решения здесь пока не видно... |
Автор: Rouse_ 3.5.2006, 12:40 |
В том то и дело что в сторону событий не получается. Дело в том что у консоли два потока. Первый ее родной в котором все это и крутиться и второй который доступен непосредственно программисту. Можно проверить крутя цил выботки сообщений - сообщения туда не проходят. Хот если установить таймер с нулевым хэндлом, то в этом цикле WM_TIME уже ловиться. Сабклассинг, как я уже сказал - не проходит к сожалению... Добавлено @ 12:41 Кстати идея с локальным хуком - очень даже может быть... |
Автор: maxim1000 3.5.2006, 12:54 |
а если попробовать написать обычный цикл сообщений? правда, тогда нужно будет логику проекта вынести в другой поток Добавлено @ 12:55 (сам я этого не пробовал, так что это - просто догадка) |
Автор: Snowy 3.5.2006, 13:05 |
Пробовали - пусто. Ни одного, даже самого маленького сообщения. Тишина полная. Консоль только эвенты дает. А там информация о меню не дается. Выдает всего один параметр - reserved. Из чего возникает нездоровый вопрос: почему программеры из M$ считают, что мы не собираемся юзать меню... |
Автор: Rouse_ 3.5.2006, 14:37 | ||||||
Мдя, вот так да. Собственно обработчик MENU_EVENT:
Его вызов в ConsoleWindowProc системное меню:
Остальное:
Я медленно офигеваю... Как все сделано: сама консоль находиться в сервере, а не реализуется приложением. Обработчик соответвенно тоже сидит в нем же. Функции работы с консолью вызываются со стороны клиента тобишь приложения... Если интересно как работает сия кухня - могу кинуть родные исходники... |