近期关于win32_API里的WM_KEYDOWN和WM_KEYUP的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯 ,并进行了系统化的梳理 。若这些内容恰好能为您提供参考,将是我们最大的荣幸。
持续按住一个键不放是产生多个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;
HWND hwnd = CreateWindow("Timer",
NULL,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
MSG msg;
bool hold = false;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
if(msg.message == WM_KEYDOWN && !hold)
{
hold = true;
DispatchMessage(&msg);
}
else if(msg.message == WM_KEYDOWN)
; // 忽略多余的按键
else if(msg.message == WM_KEYUP)
{
hold = false;
DispatchMessage(&msg);
}
else
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static TCHAR szBuf[32];
HDC hdc;
TEXTMETRIC tm;
static UINT key;
static int cyChar, i = 1;
switch(message)
{
case WM_CREATE:
hdc = GetDC (hwnd) ;
GetTextMetrics (hdc, &tm) ;
cyChar = tm.tmHeight + tm.tmExternalLeading ;
ReleaseDC (hwnd, hdc) ;
return 0;
case WM_KEYDOWN:
key = wParam;
SetTimer(hwnd, 1, 1000, NULL);
InvalidateRect(hwnd, NULL, TRUE);
return 0;
case WM_TIMER:
hdc = GetDC(hwnd);
TextOut(hdc, 0, 0, szBuf, wsprintf(szBuf, "Key: '%c' %d sec", key, i++));
ReleaseDC(hwnd, hdc);
return 0;
case WM_KEYUP:
hdc = GetDC(hwnd);
i = 1;
TextOut(hdc, 0, cyChar, szBuf, wsprintf(szBuf, "Done!"));
ReleaseDC(hwnd, hdc);
KillTimer(hwnd, 1);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
关于win32_API里的WM_KEYDOWN和WM_KEYUP的相关内容介绍到此告一段落,若这些信息对您有所启发,欢迎持续关注本站获取更多优质内容。
本文来自作者[繡譽自限慣]投稿,不代表旋风格立场,如若转载,请注明出处:https://xfg666.cn/wenzhang/731.html
评论列表(3条)
我是旋风格的签约作者“繡譽自限慣”
本文概览:近期关于win32_API里的WM_KEYDOWN和WM_KEYUP的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理。若这些内容恰好能为您提供参考,...
文章不错《win32_API里的WM_KEYDOWN和WM_KEYUP》内容很有帮助