win32_API里的WM_KEYDOWN和WM_KEYUP

近期关于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://m.xfg666.cn/wenzhang/731.html

(80)

文章推荐

发表回复

本站作者才能评论

评论列表(3条)

  • 繡譽自限慣的头像
    繡譽自限慣 2026年01月28日

    我是旋风格的签约作者“繡譽自限慣”

  • 繡譽自限慣
    繡譽自限慣 2026年01月28日

    本文概览:近期关于win32_API里的WM_KEYDOWN和WM_KEYUP的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理。若这些内容恰好能为您提供参考,...

  • 繡譽自限慣
    用户012803 2026年01月28日

    文章不错《win32_API里的WM_KEYDOWN和WM_KEYUP》内容很有帮助

客服微信:CCK8674点击复制并跳转微信

联系我们

邮件:旋风格@gmail.com

工作时间:周一至周五,9:30-17:30,节假日休息

旋风格