关于VC的WIN32编程中按键相应的问题

我在编写了一个小游戏,用键盘响应的输入,参考Windows游戏编程大师技巧后,我在头文件中定义了如下的宏#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)这两个宏定义后,的确可以在自己的函数里直接判断按键响应,很方便。但我游戏中需要的输入响应是单独的,而不是连续的按键响应。所以我按下响应按键后,可能会响应很多次,这样非常不好。对此我在KEY_DOWN(...)判断的下面加了Sleep(200);这样可以解决一下按很多次的问题,但速度又跟不上去了。在此求教高手,采用什么方法才能在自己的函数中响应单独而非连续的按键消息。我在网上也找了一番,但得到的单独按键响应处理方法都是在窗口回调函数中取的消息,而我希望在任何一个自定义函数中都可以想KEY_DOWN()判定一样得到按键的响应消息。再次多谢,答案满意再追加分数。
2026年09月26日 20:21
有4个网友回答
网友(1):

如果是键被按下响应以下代码就可以

int g_KeyValue = -1;//全局变量

键盘按下事件中

KeyPressEvents(int Value)
{
if (Value == g_KeyValue)
{
return;
}
g_KeyValue = Value;

按键值处理部分代码
}

键盘释放事件

KeyUpEvents(int Value)
{
if (Value == g_KeyValue)
g_KeyValue = -1;
}

这样一个键被按下时会响应,一直按住就不会响应,直到释放以后,重新按下,再次响应

网友(2):

加了时间判断就行了 定义个变量int shijian=0;
在按键里面的函数外围加个判断 if(GetTickCount()-shijian>??)
在这个判断里面加上shijian=GetTickCount();
这样就可以了! 上面的??是你自己需要间隔的时间 多少自己定 1000 =1秒的说1

网友(3):

WM_KEYDOWN消息里

DWORD reSend=HIWORD(pMsg->lParam);

if (reSend & 0x4000)//判断是否为自动重发消息
{
......
}

-----------------------------------------------------
补充:

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch (msg)
{
case WM_KEYDOWN:
if (HIWORD(lParam) & 0x4000)
{
return 0;
}

...........//其他处理
return 0;

...........//其他消息响应
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}

这样就可以限制所有键盘按键的自动重复消息。
---------------------------------------------------
如果你想让指定的按键限制自动重复消息。
case WM_KEYDOWN:
if ((HIWORD(lParam) & 0x4000) && ((wParam==VK_F2) || (wParam==VK_F3)))//例如只想屏蔽F2和F3的按键重复
{
return 0;
}

...........//其他处理
return 0;
----------------------------------------------
如果想随时改变1个按键的限制。那就定义1个变量,
if ((HIWORD(lParam) & 0x4000) && ((wParam==VK_F2) || (wParam==VK_F3)) && (加上你的变量限制判断) )
----------------------------------------------

这样就能达到效果。

网友(4):

你响应WM_KEYUP不就行了么?对KEYDOWN不做处理。或者再KEYDOWN里使用一个
while(1)循环,检测该键状态,不up不执行,up后break循环再执行代码。为减少cpu消耗,可在循环中设置Sleep。大小可视需要而定。