win32编程 -- 键盘消息

总有一天你会明白,能治愈你的,从来都不是时间,而是心理的那股释怀和淡然。。。。

----  网易云热评

一、键盘消息

1、键盘消息    

WM_KEYDOWN:按键被按下时产生     WM_KEYUP:按键被放开时产生     WM_SYSKEYDOWN:系统键按下时产生  比如ALT、F10     WM_SYSKEYUP:系统键放开时产生     WM_CHAR :字符消息(TranslateMessage函数发送的) 

 

2、消息参数     

按键消息:

WPARAM:按键的Virtual Key          

LPARAM:按键的参数,例如按下次数                 

WM_CHAR消息:            

WPARAM:输入的字符的ASCII字符编码值          

LPARAM:按键的相关参数

3、消息的使用

KEYDOWN可以重复出现,KEYUP只能在按键松开时出现1次 

TranslateMessage在转换WM_KEYDOWN消息时,对于可见字符可以产生WM_CHAR,不可见字符无此消息。 

WM_KEYDOWN/UP的wParam是表示的按键的虚拟键码值

​WM_CHAR的wParam是表示输入的字符的ASCII编码值。

4、相关代码

#include <windows.h>#include <stdio.h>HINSTANCE g_hInstance = 0;//接收当前程序实例句柄HANDLE g_输出句柄 = 0;//接收标准输出句柄void 按下键(HWND hWnd,WPARAM wParam){       wchar_t s[256] = {0};       swprintf_s(s, L"按下:%08X\n", wParam);       WriteConsole(g_输出句柄, s, wcslen(s), NULL, NULL);       return;}void 放开键(HWND hWnd, WPARAM wParam){       wchar_t s[256] = { 0 };       swprintf_s(s, L"松开:%08X\n", wParam);       WriteConsole(g_输出句柄, s, wcslen(s), NULL, NULL);       return;}void 字符消息(HWND hWnd, WPARAM wParam){       wchar_t s[256] = { 0 };       swprintf_s(s, L"字符消息:%08X\n", wParam);       WriteConsole(g_输出句柄, s, wcslen(s), NULL, NULL);       return;}//2、窗口处理函数LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID,       WPARAM wParam, LPARAM lParam){       //7、处理消息       switch (msgID)       {       case WM_CHAR:              字符消息(hWnd, wParam);              break;       case WM_KEYUP:              放开键(hWnd, wParam);              break;       case WM_KEYDOWN:              按下键(hWnd,wParam);              break;       case WM_DESTROY:              PostQuitMessage(0);//销毁窗口              break;       }       return DefWindowProc(hWnd, msgID, wParam, lParam);}//3、注册函数,第一个参数,窗口类名称,第二个参数,指向窗口处理函数的函数指针void Register(LPCWSTR lpClassName, WNDPROC winProc){       WNDCLASSEX wc = { 0 };       wc.cbSize = sizeof(wc);//结构体大小       wc.cbClsExtra = 0;//窗口类的申请缓存区,0表示不开启缓存       wc.cbWndExtra = 0;//窗口的申请缓存区,0表示不开启缓存       wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);//背景颜色,一般白色       wc.hCursor = NULL;//设置光标。null表示默认       wc.hIcon = NULL;//默认左上角的图标       wc.hInstance = g_hInstance;//第一个参数实例句柄,可以找到进程在那块内存       wc.lpfnWndProc = winProc; //lp 一般都是指针,处理函数名或指针       wc.lpszClassName = lpClassName;//窗口类名称,比如公司名字       wc.lpszMenuName = NULL;//没有菜单用null       wc.style = CS_HREDRAW | CS_VREDRAW;//窗口变化,会重绘,窗口类的一般风格       RegisterClassEx(&wc);}//4、创建窗口,(窗口类名称,窗口标题栏名称)HWND CreateMain(LPCWSTR lpClassName, LPCWSTR lpWindowName){       HWND hWnd = CreateWindowExW(0, lpClassName, lpWindowName,  WS_OVERLAPPEDWINDOW, 100, 100, 500, 600, NULL, NULL, g_hInstance, NULL);       return hWnd;}//5、显示窗口(窗口句柄)void Display(HWND hWnd){       ShowWindow(hWnd, SW_SHOW);//句柄,显示方式       UpdateWindow(hWnd);//调用一次刷新窗口}//6、消息循环void Message(){       MSG nMsg = { 0 };       while (GetMessage(&nMsg, nullptr, 0, 0))       {              TranslateMessage(&nMsg);              DispatchMessage(&nMsg);       }}//1、入口函数int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevIns, LPSTR lpCmdLine, int   nCmdShow){       AllocConsole();//显示dos窗口       g_输出句柄 = GetStdHandle(STD_OUTPUT_HANDLE);       g_hInstance = hInstance;       Register(L"主", WndProc);       HWND hWnd = CreateMain(L"主", L"主窗口");       Display(hWnd);       Message();       return 0;}

5、运行结果

 

欢迎关注公众号:顺便编点程

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值