== Обработка сообщений в консольном приложении ==

  • Автор темы Guest_Storm_*
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest_Storm_*

Вопрос:

Как обрабатывать сообщения посланные Виндой консольному приложению?

//Вылавливать хочу конкретные сообщения, а остальные пусть Винда обрабатывает.

//Приложение - просто Win 32 Consol Project.
//Окна нет!
//Оконной процедуры нет!
//Классов нет!
 
G

Guest

А сообщения туда аообще посылаются??
 
G

Guest

<!--QuoteBegin-Guest+5:11:2005, 19:32 -->
<span class="vbquote">(Guest @ 5:11:2005, 19:32 )</span><!--QuoteEBegin-->А сообщения туда аообще посылаются??
[snapback]26719" rel="nofollow" target="_blank[/snapback]​
[/quote]

Вообще-то, да.

Как минимум функцией СендМессадж. А у меня, при асинхронной работе с сокетами.
 
S

sup.by

А если сделать окно только не показывать его .... попрежнему есть консоль,а скрытое окно втихаря принимает сообщения. или поставить Hook на нужные тебе сообщения.
 
G

Guest

А, ну да, что-то я стормозил. Так тот-же GetMesagge(lpMsg, NULL) будет выгребать сообщения из общей очереди потока. Надо только его регулярно дергать.
 
G

Guest

А если сделать окно только не показывать его
- ну чёрного окна-то не будет. А я бы его хотел.

Ну если в цикле дёргать GetMesagge(lpMsg, NULL), то ко мне будут попадать все сообщения и мне придётся их самому обрабатывать (или нет?) (нажатие клавиш и т.д.), а мне это не надо.
 
G

Guest

<!--QuoteBegin-Guest+6:11:2005, 15:02 -->
<span class="vbquote">(Guest @ 6:11:2005, 15:02 )</span><!--QuoteEBegin-->Ну если в цикле дёргать GetMesagge(lpMsg, NULL), то ко мне будут попадать все сообщения и мне придётся их самому обрабатывать (или нет?) (нажатие клавиш и т.д.), а мне это не надо.
[snapback]26729" rel="nofollow" target="_blank[/snapback]​
[/quote]
Так там в параметрах можно фильтр задать. Смысл в том, что можно не указывать окно.
 
G

Guest

Почему черного окна не будет? делаешь обычное консольное приложение с точкой входа в виде ф-ии main ... и в теле этой функции создаешь окно .... указываешь оконную процедуру итд .... а после этого ствишь цикл

while (GetMessage (&msg, NULL, 0, 0))
{

TranslateMessage (&msg) ;
DispatchMessage (&msg) ;

}


.... и спокойно обрабатываешь сообщения в оконной процедуре указанной при создании окна
 
G

Guest

<!--QuoteBegin-Guest+6:11:2005, 17:20 -->
<span class="vbquote">(Guest @ 6:11:2005, 17:20 )</span><!--QuoteEBegin-->Почему черного окна не будет? делаешь обычное консольное приложение с точкой входа в виде ф-ии main ... и в теле этой функции создаешь окно .... указываешь оконную процедуру итд .... а после этого ствишь цикл

while (GetMessage (&msg, NULL, 0, 0))
{

TranslateMessage (&msg) ;
DispatchMessage (&msg) ;

}
.... и спокойно обрабатываешь сообщения в оконной процедуре указанной при создании окна
[snapback]26732" rel="nofollow" target="_blank[/snapback]​
[/quote]

А, понял, здорово. Но это как-то типо обманом: т.е. код программы будет на 90% такой же, как и при создании обычного оконного приложения, но только это всё будет спрятано в int main(..){}, т.е. сделали консольную обёртку для оконного приложения. Хотя тоже вариант.
Спасибо.
 
G

Guest

<!--QuoteBegin-Guest+6:11:2005, 17:02 -->
<span class="vbquote">(Guest @ 6:11:2005, 17:02 )</span><!--QuoteEBegin-->Так там в параметрах можно фильтр задать. Смысл в том, что можно не указывать окно.
[snapback]26730" rel="nofollow" target="_blank[/snapback]​
[/quote]

BOOL GetMessage(LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);

А, ну фильтр вроде так делается:
wMsgFilterMin
[in] Specifies the integer value of the lowest message value to be retrieved. Use WM_KEYFIRST to specify the first keyboard message or WM_MOUSEFIRST to specify the first mouse message.
Windows XP: Use WM_INPUT here and in wMsgFilterMax to specify only the WM_INPUT messages.

If wMsgFilterMin and wMsgFilterMax are both zero, GetMessage returns all available messages (that is, no range filtering is performed).

wMsgFilterMax
[in] Specifies the integer value of the highest message value to be retrieved. Use WM_KEYLAST to specify the first keyboard message or WM_MOUSELAST to specify the last mouse message.
Windows XP: Use WM_INPUT here and in wMsgFilterMin to specify only the WM_INPUT messages.

If wMsgFilterMin and wMsgFilterMax are both zero, GetMessage returns all available messages (that is, no range filtering is performed).
========================

Я плохо понял, что тут написано. Т.е. вопрос о том, как поставить фильтр на определённое сообщение открыт. Точно ли можно это сделать?

А для консольного окна тоже можно получить hWND и его прописать в GetMessege.
 
G

Guest_Storm_*

А, я понял, что там написано: там указываютя инткрвал приёма сообщений, т.е. от какого до какого принимать. Если там и там указать одно и тоже сообщение, то приниматься будет оно.

Ну и получается, что надо поставить цикл

while (GetMessage (&msg, NULL, что-то, что-то))
{
обработать что-то

}

Как-то просто :huh:
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!