是这样的,我很多键同时按下,消息队列堆了一堆消息,然后把所有的键都松掉,
但是还是程序还会响应消息一段时间,然而这时候是什么键都没按下的。看上去,会不爽,怎么处理?我处理的思路是,当有键按抬起时,把消息队列清空。但是会有问题,抬起键的消息总是排在那一堆消息之后,
所以我想问有没有方法在消息循环时每次取得是最新的消息。PS:我的程序是win32程序,消息循环用 GetMessage PeekMessage都不行
但是还是程序还会响应消息一段时间,然而这时候是什么键都没按下的。看上去,会不爽,怎么处理?我处理的思路是,当有键按抬起时,把消息队列清空。但是会有问题,抬起键的消息总是排在那一堆消息之后,
所以我想问有没有方法在消息循环时每次取得是最新的消息。PS:我的程序是win32程序,消息循环用 GetMessage PeekMessage都不行
MSG msg;
PeekMessageW(&msg,NULL,WM_KEYUP,WM_KEYUP,PM_NOREMOVE)
或者直接direct input吧........
等你响应keyup消息时,消息队列里都没消息了。
你可能有多个keydown,post多个usermessage,消息队列里有是usermessage在排队,和keyup的顺序没关系
可能我的建议不好
你是不是可以考虑用DirectInput
...
OnKeyDown(..)
{
PostMessage(UM_MYPROC..) //处理数据
}OnKeyUp()
{
while(peekmessage(UM_MYPROC.., PM_REMOVE)); //移除消息
}OnMyProcMsg()
{
...//处理加在这里
}
#define UM_MYPROC WM_USER + 100
...
Cwnd1::OnKeyDown(..)
{
PostMessage(hwnd2, UM_MYPROC..) //处理数据
}Cwnd1::OnKeyUp()
{
while(peekmessage(hwnd2, UM_MYPROC.., PM_REMOVE)); //移除消息
}CWnd2::OnMyProcMsg()
{
...//处理加在这里
}
不知道有没有好一点的方法
昨天后来下班后家就没上网
独立线程处理键盘消息我见人讨论过
自己没有具体做过
所以提不出什么具体的方案
不过你其实可以考虑用DirectInput
这样太耗cpu了。
加个延时就好了
directinput很底层
效率很高
关键是我用Arm9的处理器。这种消耗很奢侈啊,有没有不很耗CPU的方法啊?
我都是用DirectX做游戏
要独立应用的得现做
而且我好久没用了
电脑上都没有DXSDK了我的意思是
你循环检测的时候在循环体里Sleep(10)
就可以释放出CPU了
而且基本不影响应用
{
TranslateMessage(&msg);
if (msg.message == WM_KEYUP || msg.message == WM_KEYDOWN)
{
if (msg.message == WM_KEYUP)
{
while(PeekMessage(g_tempWnd....));
}
else
{
PostMessage(g_tempWnd, msg.message, msg.wParam, msg.lParam);
}
}
else
{
DispatchMessage(&msg);
}
}
TRACE("peek success\n");成功trace一下确保你成功peek到了
解决方法是按oldn_CC_bird的思路。
不过我是自己做了一个队列专门放按键消息的。谢谢楼上的所有的朋友们了。