Подскажите, как организовать обработку сообщений Windows в консольном приложении?
Здравствуйте Андрей А. Тельнов, Вы писали:
ААТ>Подскажите, как организовать обработку сообщений Windows в консольном приложении?
Создать невидимое окно и обрабатывать сообщения в его оконной процедуре.
А в main вставить цикл
while ( GetMessage( &msg, NULL, 0, 0 ) )
{
DispatchMessage( &msg );
}
Здравствуйте Андрей А. Тельнов, Вы писали:
ААТ>Подскажите, как организовать обработку сообщений Windows в консольном приложении?
Распространенное заблуждение.
Консольное приложение отличается от оконного только одним словом в PE Header: WORD Subsystem. Для консольного приложения Subsystem=3, а для GUI приложения Subsystem=2. В зависимости от этого, Windows создает (или не создает) консоль при запуске программы.
Фактически, разница еще меньше. Независимо от того, решила ли ОС при старте приложения создать консоль, само приложение может создать окно Windows и обрабатывать его сообщения, или же создать консоль и использовать console i/o.
Итак, любое приложение может обрабатывать оконные сообщения (если у него есть окно) или сообщения потоку.
Так что же имелось в виду?
Здравствуйте retalik, Вы писали:
R>Консольное приложение отличается от оконного только одним словом в PE Header: WORD Subsystem. Для консольного приложения Subsystem=3, а для GUI приложения Subsystem=2. В зависимости от этого, Windows создает (или не создает) консоль при запуске программы.
R>Фактически, разница еще меньше. Независимо от того, решила ли ОС при старте приложения создать консоль, само приложение может создать окно Windows и обрабатывать его сообщения, или же создать консоль и использовать console i/o.
А вот не совсем. Я пробовал сделать так и постоянно натыкался на всякие грабли.
R>Итак, любое приложение может обрабатывать оконные сообщения (если у него есть окно) или сообщения потоку.

Чтото вы дяденька напутали. Для обработки сообщений их сначала нужно извлечь окудато. А очередь сообщений то у нас и не создана ! Создается она при вызове всяких оконных функций. Достаточно одного вызова (в МСДН описывается) и создастся очередб сообщений. А высмыкать оотуда сообщения хучь PeekMessage, хучь GetMessage.
А еще в консоли просто так нельзя достучатся до хэндла потока и хендла процесса. И многопотоковость тут очень неудобно реализовывать.
Здравствуйте Hollander, Вы писали:
R>>Фактически, разница еще меньше. Независимо от того, решила ли ОС при старте приложения создать консоль, само приложение может создать окно Windows и обрабатывать его сообщения, или же создать консоль и использовать console i/o.
H>А вот не совсем. Я пробовал сделать так и постоянно натыкался на всякие грабли.
Грабли могли быть и не связаны с консолью. Например, линковалась не та версия рантайма. Судя по тому, что пишешь дальше, это вполне возможно.
R>>Итак, любое приложение может обрабатывать оконные сообщения (если у него есть окно) или сообщения потоку.
H>
Чтото вы дяденька напутали. Для обработки сообщений их сначала нужно извлечь окудато. А очередь сообщений то у нас и не создана ! Создается она при вызове всяких оконных функций. Достаточно одного вызова (в МСДН описывается) и создастся очередб сообщений. А высмыкать оотуда сообщения хучь PeekMessage, хучь GetMessage.
BOOL GetMessage(
LPMSG lpMsg, // message information
HWND hWnd, // handle to window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax // last message
);
hWnd
[in] Handle to the window whose messages are to be retrieved. The window must belong to the calling thread. The following value has a special meaning. Value Meaning
NULL GetMessage retrieves messages for any window that belongs to the calling thread and
thread messages posted to the calling thread using the
PostThreadMessage function.
H>А еще в консоли просто так нельзя достучатся до хэндла потока и хендла процесса. И многопотоковость тут очень неудобно реализовывать.
"В консоли просто так нельзя..." — это все равно что сказать "в деревне просто так нельзя достучатся до хэндла потока".
Причем здесь консоль?! Ты имеешь в виду, что функция main не имеет параметра HINSTANCE или что-то другое?
Поверь мне. Тысячи раз создавал оконные программы, которые, например, писали в консоль диагностику — и никаких проблем.