Консольные приложения
От: Андрей А. Тельнов  
Дата: 01.03.02 10:16
Оценка:
Подскажите, как организовать обработку сообщений Windows в консольном приложении?
Re: Консольные приложения
От: Willi  
Дата: 01.03.02 10:29
Оценка:
Здравствуйте Андрей А. Тельнов, Вы писали:

ААТ>Подскажите, как организовать обработку сообщений Windows в консольном приложении?


Создать невидимое окно и обрабатывать сообщения в его оконной процедуре.
А в main вставить цикл

while ( GetMessage( &msg, NULL, 0, 0 ) )
{
    DispatchMessage( &msg );
}
\/\/i||i
Re: Консольные приложения
От: retalik www.airbandits.com/
Дата: 01.03.02 10:36
Оценка:
Здравствуйте Андрей А. Тельнов, Вы писали:

ААТ>Подскажите, как организовать обработку сообщений Windows в консольном приложении?


Распространенное заблуждение.

Консольное приложение отличается от оконного только одним словом в PE Header: WORD Subsystem. Для консольного приложения Subsystem=3, а для GUI приложения Subsystem=2. В зависимости от этого, Windows создает (или не создает) консоль при запуске программы.

Фактически, разница еще меньше. Независимо от того, решила ли ОС при старте приложения создать консоль, само приложение может создать окно Windows и обрабатывать его сообщения, или же создать консоль и использовать console i/o.

Итак, любое приложение может обрабатывать оконные сообщения (если у него есть окно) или сообщения потоку.

Так что же имелось в виду?
Успехов,
Виталий.
Re[2]: Консольные приложения
От: Hollander Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.03.02 10:55
Оценка:
Здравствуйте retalik, Вы писали:

R>Консольное приложение отличается от оконного только одним словом в PE Header: WORD Subsystem. Для консольного приложения Subsystem=3, а для GUI приложения Subsystem=2. В зависимости от этого, Windows создает (или не создает) консоль при запуске программы.


R>Фактически, разница еще меньше. Независимо от того, решила ли ОС при старте приложения создать консоль, само приложение может создать окно Windows и обрабатывать его сообщения, или же создать консоль и использовать console i/o.


А вот не совсем. Я пробовал сделать так и постоянно натыкался на всякие грабли.

R>Итак, любое приложение может обрабатывать оконные сообщения (если у него есть окно) или сообщения потоку.


Чтото вы дяденька напутали. Для обработки сообщений их сначала нужно извлечь окудато. А очередь сообщений то у нас и не создана ! Создается она при вызове всяких оконных функций. Достаточно одного вызова (в МСДН описывается) и создастся очередб сообщений. А высмыкать оотуда сообщения хучь PeekMessage, хучь GetMessage.

А еще в консоли просто так нельзя достучатся до хэндла потока и хендла процесса. И многопотоковость тут очень неудобно реализовывать.
Re[2]: Консольные приложения
От: Hollander Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.03.02 10:57
Оценка:
Здравствуйте Willi, Вы писали:

W>Создать невидимое окно и обрабатывать сообщения в его оконной процедуре.


А можно и не создавать окно. Есть куча функций, при вызове которых создается очередь сообщений. А потом оттуда таскать сколько угодно.
Re[3]: Консольные приложения
От: retalik www.airbandits.com/
Дата: 01.03.02 11:08
Оценка: 5 (1)
Здравствуйте 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 или что-то другое?

Поверь мне. Тысячи раз создавал оконные программы, которые, например, писали в консоль диагностику — и никаких проблем.
Успехов,
Виталий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.