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"按下:%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、运行结果

0a2653c851af460fa595bd959398a8f1.png

目录
相关文章
|
7月前
|
SQL 人工智能 Java
Claude Code + 积木报表:一分钟生成复杂报表(JimuReport v2.3.2 发布)
JimuReport AI专题研究 20260413 发布,Claude Code Skills 接管报表生成 划重点:现在可以一句话生成报表了![JimuReport AI 生成报表效果](https://oscimg.oschina.net/oscnet/upaa112e14274775ac
451 0
Claude Code + 积木报表:一分钟生成复杂报表(JimuReport v2.3.2 发布)
|
11月前
|
移动开发 监控 小程序
校园系统小程序源码搭建全流程:基于 Uni-app/TP6,快速落地校园服务生态
在教育数字化转型背景下,校园小程序整合教务、生活、社交等全场景服务,通过Uni-app+TP6实现多端覆盖与高效开发,支持校园卡、食堂点餐、家长端等功能,助力学校构建稳定、低成本的智慧校园生态。
【Qt 学习笔记】Qt常用控件 | 布局管理器 | 表单布局Form Layout
【Qt 学习笔记】Qt常用控件 | 布局管理器 | 表单布局Form Layout
966 2
|
API C# Windows
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
本篇主要介绍一些与窗口句柄相关的一些API,比如设置窗口状态、当前激活的窗口、窗口客户区的大小、鼠标位置、禁用控件等,以及介绍Winform中的句柄属性,便于直接获取控件或窗体句柄,以及不推荐...
5540 0
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
|
安全 编译器 C++
constexpr、const和 #define 的比较
本文比较了 `constexpr`、`const` 和 `#define` 在 C++ 中定义常量和函数的优缺点。`constexpr` 用于编译期求值,提供更高的性能和类型安全性;`const` 保证变量在运行期间不可修改,增强代码可靠性;`#define` 用于宏定义,适用于简单的常量和跨平台兼容性。选择时应根据具体需求和代码上下文决定。
|
Linux 芯片
一篇文章讲明白Linux下控制GPIO的三种方法
一篇文章讲明白Linux下控制GPIO的三种方法
3221 3
|
异构计算
TCL管理Vivado工程
TCL管理Vivado工程
|
编译器 C语言 C++
C/C++编译优化技巧:预编译头文件(PCH)使用方法
C/C++编译优化技巧:预编译头文件(PCH)使用方法
2281 1
The authenticity of host ‘gitee.com (180.76.198.77)‘ can‘t be established.ED25519 key fingerprint i
The authenticity of host ‘gitee.com (180.76.198.77)‘ can‘t be established.ED25519 key fingerprint i
|
机器学习/深度学习 并行计算 计算机视觉
【入坑指南】| OpenCV4.8 + CUDA + 扩展模块支持编译
【入坑指南】| OpenCV4.8 + CUDA + 扩展模块支持编译
1597 0