win32_API里的WM_KEYDOWN和WM_KEYUP

来源:百度知道 编辑:UC知道 时间:2024/06/21 22:30:23
为什么按住一个键不放,貌似会持续产生这两个消息,我把SetTimer放在WM_KEYDOWN里面,KillTimer放在WM_KEYUP里面,但系统成对产生这两个消息的话,按键激活SetTimer,松键中断SetTimer目的就无法达到,我该怎么解决,请高手指点一下啊,我是初学者...o(0.0)o

持续按住一个键不放是产生多个WM_KEYDOWN,最后只产生一个WM_KEYUP,你的timer无法被处理是因为WM_TIMER在消息队列中的优先级别很低,你按下键的时候在不断地向窗口发送WM_KEYDOWN消息,所以timer的消息处理不到,解决方法是在消息循环里做手脚,如果按下了一个键而没有弹起的话,就忽略之后的按键消息,这样就能腾出时间来处理timer了:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
WNDCLASS ws;

ws.style = CS_HREDRAW | CS_VREDRAW;
ws.lpfnWndProc = WndProc;
ws.cbClsExtra = 0;
ws.cbWndExtra = 0;
ws.hInstance = hInstance;
ws.hIcon = LoadIcon(NULL, IDI_APPLICATION);
ws.hCursor = LoadCursor(NULL, IDC_ARROW);
ws.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
ws.lpszMenuName = NULL;
ws.lpszClassName = "Timer";

if(!RegisterClass(&ws))
return 0;