例如我用下面一扑获键盘消息循环,但把他放在哪里合适?如果放在主程序就阻塞程序。
如何把::PostQuitMessage(0) 传给他。
这只是一例子。还请大虾讲讲如何学习消息及消息队列。
while(GetMessage(&msg, NULL, WM_KEYFIRST, WM_KEYLAST) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
谢谢
如何把::PostQuitMessage(0) 传给他。
这只是一例子。还请大虾讲讲如何学习消息及消息队列。
while(GetMessage(&msg, NULL, WM_KEYFIRST, WM_KEYLAST) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
谢谢
pMsg->wParam指键盘的键值:112对应f1
BOOL CMysunApp::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class if(pMsg->message==WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case 112:
do...
break;
}
}
}
可是程序依然阻塞。死循环。怎样退出。
while(GetMessage(&msg, NULL, WM_KEYFIRST, WM_KEYLAST) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
如果要用,也应该是: MSG Message;
while (::PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&Message);
::DispatchMessage(&Message);
}
偶qq 54928978
wuchuncai(1234567)
的方法不错的,我经常这样用的。当然了,你想自己给控件发消息的话,可以用PostMessage()发消息。如果是键盘消息,要发两个(down,up)消息,否则会有问题的。
为什么你的消息循环在主程序中会出现问题呢?
请参看GetMessage()后两个参数的的定义——你的窗口消息之处理你定义范围内的消息
如果你要处理键盘相应的消息,不妨在其他的地方来响应
用键盘的钩子函数或者其他什么处理键盘消息的消息来处理好了
先OnButton2(),再OnButton3()
可是什么都没做!#define WM_MY_MESSAGE WM_USER+1
hWnd = this->m_hWnd;BOOL CMy1Dlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message==WM_MY_MESSAGE)
{
int i = 1;
}
return CDialog::PreTranslateMessage(pMsg);
}
void CMy1Dlg::OnButton2()
{
while( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
void CMy1Dlg::OnButton3()
{
::SendMessage(hWnd, WM_MY_MESSAGE, 0, 0);
}
看你的程序是MFC向导产生的框架。MFC把消息完全封装掉了,你根本不能再在MFC程序里处理消息。要用消息编程,就要写基础Win32程序,用“Win32 Application”向导,不要用MFC向导。
解决了就说出来吗,窝在肚子多不舒服,说出来就舒服了。 :)
while( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
其实就是
while( this->PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
{
this->::TranslateMessage(&msg);
this->DispatchMessage(&msg);
}
this指向CMy1Dlg,CMy1Dlg已经有了自己的消息循环处理,你又在他内部来一遍,你想你能截获到任何消息吗?你根本截获不了任何消息,因为在你截获之前已经被CMy1Dlg自己处理了,消息队列已经空了,你还想截获什么?
想不通你为什么要这样做,直接用CMy1Dlg消息循环就行了,做法类似你的OnButton2()OnButton3(),这是两个按钮消息,你已经截获了,只不过稍微改一下就能截获键盘消息了另外要注意,消息是针对指定窗口的,比如你的窗口失去焦点以后,就不能截获键盘消息了,这时,如果你还想截获金盘消息,可以用键盘HOOK
下班回家再看书。
消息循环是一个程序活动的标志!
如果一个消息退出了,你的程序也差不多结束了。在你的消息循环体中,Windows会调用你的消息处理函数进行消息处理,完成相应的功能的。你不用担心。
当一个特定消息发生时。你的程序可能想结束自己的生命,你就可以在任何地方使用PostQuitMessage(0),系统就会在消息队列放一个编号为0的消息。你的消息循环就会检测到它,然后就可以自杀了!
那就重载CWinApp的Run函数!