win32编程实例(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"按下:X\n", wParam); WriteConsole(g_输出句柄, s, wcslen(s), NULL, NULL); return; } void 放开键(HWND hWnd, WPARAM wParam) { wchar_t s[256] = { 0 }; swprintf_s(s, L"松开:X\n", wParam); WriteConsole(g_输出句柄, s, wcslen(s), NULL, NULL); return; } void 字符消息(HWND hWnd, WPARAM wParam) { wchar_t s[256] = { 0 }; swprintf_s(s, L"字符消息:X\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、运行结果

win32编程实例(win32编程--键盘消息)(1)

win32编程实例(win32编程--键盘消息)(2)

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

win32编程实例(win32编程--键盘消息)(3)

win32编程实例(win32编程--键盘消息)(4)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页