强制输出wParam 和 lParam,会是什么内容?

当你“强制输出” wParamlParam 时,通常是指在调试或日志记录中直接查看这些参数的原始数值。这些值的内容会根据消息类型的不同而有所变化,因为 wParamlParam 的意义和使用取决于它们所在的消息上下文。

下面我将详细讨论在不同消息情况下,wParamlParam 可能包含的内容,以及如何强制输出它们。

强制输出 wParamlParam

在 C/C++ 中,"强制输出"通常是指使用打印函数(如 printfOutputDebugString)直接打印 wParamlParam 的值。这可以帮助你在调试过程中查看这些参数的原始数据。

如何输出 wParamlParam

你可以使用以下代码片段来输出 wParamlParam 的值:

printf("wParam: %ld, lParam: %ld\n", (long)wParam, (long)lParam);

或者在 Windows 环境下使用 OutputDebugString 将调试信息输出到调试器窗口:

char buffer[100];
snprintf(buffer, sizeof(buffer), "wParam: %ld, lParam: %ld\n", (long)wParam, (long)lParam);
OutputDebugString(buffer);

不同消息情况下 wParamlParam 的内容

不同消息类型的 wParamlParam 含义不同。以下是一些常见的消息及其参数含义和输出内容示例:

1. 键盘消息(WM_KEYDOWNWM_KEYUPWM_CHAR
  • wParam:通常是虚拟键码(如 VK_RETURN 表示 Enter 键)。
  • lParam:包含有关按键的附加信息,如按键重复次数、扫描码、扩展键标志等。

强制输出示例:

case WM_KEYDOWN: {printf("WM_KEYDOWN: wParam (Virtual Key Code): %ld, lParam: %ld\n", (long)wParam, (long)lParam);break;
}

示例输出

WM_KEYDOWN: wParam (Virtual Key Code): 13, lParam: 536870913

解释:wParam 是虚拟键码 13VK_RETURN),lParam 的值 536870913 结合了按键重复次数、扫描码和扩展键标志。

2. 鼠标消息(WM_MOUSEMOVEWM_LBUTTONDOWNWM_RBUTTONUP
  • wParam:鼠标按键状态(如 MK_LBUTTON 表示鼠标左键被按下)。
  • lParam:鼠标指针的 x 和 y 坐标,使用低 16 位和高 16 位表示。

强制输出示例:

case WM_MOUSEMOVE: {printf("WM_MOUSEMOVE: wParam (Mouse Key State): %ld, lParam (Position): %ld\n", (long)wParam, (long)lParam);break;
}

示例输出

WM_MOUSEMOVE: wParam (Mouse Key State): 1, lParam (Position): 655370

解释:wParam1(通常表示 MK_LBUTTON),lParam655370。用 LOWORD(lParam)HIWORD(lParam) 分别提取鼠标的 x 和 y 坐标。

3. 窗口调整大小消息(WM_SIZE
  • wParam:表示调整大小的类型(如 SIZE_MINIMIZEDSIZE_MAXIMIZED)。
  • lParam:窗口的新宽度(低 16 位)和高度(高 16 位)。

强制输出示例:

case WM_SIZE: {printf("WM_SIZE: wParam (Resize Type): %ld, lParam (New Size): %ld\n", (long)wParam, (long)lParam);break;
}

示例输出

WM_SIZE: wParam (Resize Type): 2, lParam (New Size): 3276800

解释:wParam2SIZE_MAXIMIZED),lParam3276800,表示新的窗口宽度和高度。

4. 命令消息(WM_COMMAND
  • wParam:低位字是控件的 ID 或命令标识符,高位字是通知代码。
  • lParam:是控件的句柄(HWND)。

强制输出示例:

case WM_COMMAND: {printf("WM_COMMAND: wParam (ID and Code): %ld, lParam (Control Handle): %ld\n", (long)wParam, (long)lParam);break;
}

示例输出

WM_COMMAND: wParam (ID and Code): 65537, lParam (Control Handle): 123456

解释:wParam 的低 16 位 1 是控件 ID,高 16 位 1 是通知代码(例如按钮点击)。lParam 为控件的句柄。

5. 自定义消息(如 WM_USER 及以上)

自定义消息的 wParamlParam 完全由程序员定义。

  • wParam:可以是任何需要传递的整数值、标志等。
  • lParam:可以是指针、句柄、结构体、整数值等。

强制输出示例:

case WM_USER_MY_MESSAGE: {printf("WM_USER_MY_MESSAGE: wParam: %ld, lParam: %ld\n", (long)wParam, (long)lParam);break;
}

示例输出

WM_USER_MY_MESSAGE: wParam: 100, lParam: 200

解释:wParamlParam 是根据自定义需求传递的值,具体意义需要参考自定义消息的处理逻辑。

如何理解强制输出的内容

输出的 wParamlParam 的数值本身通常是一些整数表示的位模式。通过这些值,你可以获取消息携带的具体信息。使用正确的宏(如 LOWORDHIWORDGET_WHEEL_DELTA_WPARAM 等)可以分解这些位模式,并提取出有意义的数据。例如,LOWORD(lParam)HIWORD(lParam) 经常用于分解 32 位的 lParam 中的两个 16 位值,分别代表鼠标坐标、窗口尺寸等。

总结

通过强制输出 wParamlParam 的值,你可以在调试时查看这些参数的原始数值,这有助于理解不同消息的内部结构和数据传递方式。不同的消息类型会将不同的信息编码到这两个参数中,因此,了解如何正确解析这些参数对于有效地处理消息至关重要。

 

#include <windows.h>
#include <stdio.h>LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {switch (msg) {case WM_KEYDOWN: {// 获取虚拟键码int virtualKeyCode = (int)wParam;// 获取按键重复计数int repeatCount = LOWORD(lParam);// 提取扫描码(高字节的低 8 位)int scanCode = (HIWORD(lParam) & 0xFF);// 扩展键标志int isExtendedKey = (HIWORD(lParam) & KF_EXTENDED) ? 1 : 0;// 格式化信息并更新窗口标题栏char buf[256];snprintf(buf, sizeof(buf), "VK Code: %d, Repeat Count: %d, Scan Code: %d, Extended Key: %d",virtualKeyCode, repeatCount, scanCode, isExtendedKey);SetWindowText(hwnd, buf);// 输出到调试控制台printf("VK Code: %d, Repeat Count: %d, Scan Code: %d, Extended Key: %d\n",virtualKeyCode, repeatCount, scanCode, isExtendedKey);break;}case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd, msg, wParam, lParam);}return 0;
}int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {const char CLASS_NAME[] = "Sample Window Class";// 定义窗口类WNDCLASS wc = {};wc.lpfnWndProc = WndProc;wc.hInstance = hInstance;wc.lpszClassName = CLASS_NAME;wc.hCursor = LoadCursor(NULL, IDC_ARROW);  // 添加光标// 注册窗口类if (!RegisterClass(&wc)) {MessageBox(NULL, "Window Class Registration Failed!", "Error", MB_OK | MB_ICONERROR);return 0;}// 创建窗口HWND hwnd = CreateWindowEx(0,CLASS_NAME,"Key Info Window",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL,NULL,hInstance,NULL);if (hwnd == NULL) {MessageBox(NULL, "Window Creation Failed!", "Error", MB_OK | MB_ICONERROR);return 0;}// 显示窗口ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return 0;
}
// 解释:
// WM_KEYDOWN 消息处理:// 虚拟键码 (virtualKeyCode) 从 wParam 中获取。
// 按键重复计数 (repeatCount) 从 lParam 的低字节中获取。
// 扫描码 (scanCode) 从 lParam 的高字节中提取(通过 HIWORD(lParam) & 0xFF)。
// 扩展键标志 (isExtendedKey) 从 lParam 的高字节中提取(通过 HIWORD(lParam) & KF_EXTENDED)。
// 使用 snprintf 格式化信息并更新窗口标题栏,以显示按键的详细信息。
// 输出到调试控制台:// 使用 printf 将按键信息输出到调试控制台,便于调试和验证信息的正确性。
// 窗口创建和消息循环:// 程序创建一个窗口并进入消息循环,以处理窗口消息,包括按键消息。
// 这个示例演示了如何处理 WM_KEYDOWN 消息并获取相关的按键信息,以及如何将这些信息显示在窗口标题栏上。你可以运行这个程序并按下不同的键,以查看窗口标题栏中显示的按键信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

白酒与家庭聚会:温馨与和谐的时光

在繁忙的都市生活中&#xff0c;家庭聚会是每个人心中那份较温暖的港湾。每当夜幕降临&#xff0c;灯火通明&#xff0c;家人们围坐在一起&#xff0c;谈笑风生&#xff0c;那份温馨与和谐仿佛能够驱散一切疲惫。而在这个温馨的时刻&#xff0c;白酒——豪迈白酒&#xff08;HO…

Python 爬虫入门(十二):正则表达式「详细介绍」

Python 爬虫入门&#xff08;十二&#xff09;&#xff1a;正则表达式 前言一、正则表达式的用途二、正则表达式的基本组成元素2.1 特殊字符2.2 量词2.3 位置锚点2.4 断言2.5 字符集2.6 字符类2.6.1 基本字符类2.6.2 常见字符类简写2.6.3 POSIX字符类2.6.4 组合使用 三、 正则表…

如何使用ssm实现亿互游在线平台设计与开发+vue

TOC ssm118亿互游在线平台设计与开发vue 绪论 1.1研究背景 时代的发展&#xff0c;我们迎来了数字化信息时代&#xff0c;它正在渐渐的改变着人们的工作、学习以及娱乐方式。计算机网络&#xff0c;Internet扮演着越来越重要的角色&#xff0c;人们已经离不开网络了&#x…

2024世界机器人大会盛大开幕,卓翼飞思携无人智能领域产品集中亮相 !

开放创新 聚享未来&#xff01;万众瞩目的2024世界机器人大会暨博览会于8月21日在北京亦创国际会展中心盛大开幕。大会聚焦机器人技术与产业前沿趋势&#xff0c;展示机器人创新应用赋能千行百业的多元场景&#xff0c;全球顶尖的机器人科学家、行业领袖、创新精英汇聚一堂&…

Pandas教程:使用Pandas合并多个Excel文件

目录 1. 环境准备 1.1 安装Pandas 1.2 准备工作 2. 基本概念 2.1 Pandas简介 2.2 DataFrame的基本操作 3. 读取Excel文件 4. 合并多个Excel文件 4.1 获取文件列表 4.2 读取并合并数据 4.3 处理重复数据 5. 数据存储 6. 完整示例代码 7.代码优化 7.1用类去重新组…

vue3动态引入图片不显示问题

方法1.(打包后动态引用的图片未被打包入工程中,webpack,vite) 1.图片放到public 目录会更省事&#xff0c;不管是开发环境还是生产环境&#xff0c;可以始终以根目录保持图片路径的一致. 假设&#xff1a; 静态文件目录&#xff1a;src/assets/images/ 我们的目标静态文件在 …

Python实现打印http请求信息例子解析

示例代码 import http.clientdef print_http_info(host, path):conn http.client.HTTPConnection(host)method GETurl pathprint(f"{- * 30} 请求信息 {- * 30}")print(f"主机: {host}")print(f"方法: {method}")print(f"URL: {url}&qu…

深入理解Spring Boot日志框架与配置

目录 Spring Boot日志框架概述Spring Boot默认日志框架&#xff1a;Logback日志配置文件日志级别的调整日志输出配置日志格式化日志轮转和归档集成其他日志框架日志管理工具最佳实践总结 Spring Boot日志框架概述 Spring Boot 支持多种日志框架&#xff0c;如 Logback、Log4…

使用HAL库实现按键控制LED和蜂鸣器

下载STM32CubeMX实现项目的初始配置&#xff08;寄存器操作)&#xff0c;下载keil对程序进行编译烧写 在STM32CubeMX中将PB0/PB1设置为输入引脚作为按键&#xff0c;PA6/PA4设置为输出引脚作为led和Beep&#xff0c;将按键引脚设置为上拉输入&#xff1a; 创建项目完成后在kei…

【jvm】程序计数器的特征

目录 1. 说明2. 线程私有3. 存储指令地址4. 不会发生内存溢出5. 生命周期与线程相同 1. 说明 1.JVM&#xff08;Java虚拟机&#xff09;中的程序计数器&#xff08;Program Counter Register&#xff09;&#xff0c;简称PC寄存器&#xff0c;具有几个显著的特征&#xff0c;这…

C语言 | Leetcode C语言题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; bool canMeasureWater(int jug1Capacity, int jug2Capacity, int targetCapacity) {int j1 jug1Capacity < jug2Capacity ? jug1Capacity : jug2Capacity, j2 jug1Capacity > jug2Capacity ? jug1Capacity : jug2Capacity;if (ta…

Umi-OCR 文字识别工具

免费开源的离线orc识别功能 git地址 感谢大佬的贡献 Umi-OCR 文字识别工具 使用说明 • 下载地址 • 更新日志 • 提交Bug 免费&#xff0c;开源&#xff0c;可批量的离线OCR软件 适用于 Windows7 x64 、Linux x64 免费&#xff1a;本项目所有代码开源&#x…

推荐系统三十六式学习笔记:产品篇36 | 组建推荐团队及工程师的学习路径

目录 团队组建个人成长总结 如果你是老板&#xff0c;或者是公司里的推荐系统包工头&#xff0c;那么你一定会关心&#xff1a;要凑齐多少人才能开始搬砖&#xff1f; 一个推荐系统复杂度没有上限&#xff0c;但是有最低标准&#xff0c;所以下面在估算推荐系统团队规模时&…

SpringBoot (面试篇)

什么是SpringBoot 通过SpringBoot&#xff0c;可以轻松的创建独立的&#xff0c;基于生产级别的Spring的应用程序&#xff0c;您可以“运行”它们。大多数SpringBoot应用程序要最少的Sprig配置 为什么要用SpringBoot 快速开发 快速整合 配置简化 内嵌服务容器 SpringBoot与…

Verilog刷题笔记59

题目: Exams/m2014 q6c 解题&#xff1a; module top_module (input [6:1] y,input w,output Y2,output Y4);assign Y2y[1]&w0;assign Y4(y[2]&w1)|(y[3]&w1)|(y[5]&w1)|(y[6]&w1);endmodule结果正确: 注意点: 起初&#xff0c;我的代码有错误,代码如下…

9 正则表达式:Java爬虫和正则表达式、String中的正则表达式方法(基本语法7)

文章目录 前言一、正则表达式1 [ ] 语法(1)[ABC] 和 [^ABC](2)[A-Z]和[a-zA-Z]小总结2 特殊字符语法(\w 这些)3 数量符4 \ 、()、 |5 锚点 ^ 和 $,\b,\B6 (?i) : 忽略其后面的大小写 ---- 这个Java是可以的,其他语言我不知道(正则表达式虽然大多通用,但也有部分是…

视频检索技术为电子商务直播领域带来了前所未有的革新

视频检测在这个场景中指的是通过视频流实时识别和检索直播中销售人员展示的商品。这涉及到从连续的视频帧中分析和识别商品的视觉内容&#xff0c;通常与语音和文本数据结合&#xff0c;以提高识别准确性。 技术原理 文本引导的注意机制&#xff1a;这一机制通过直播中销售人员…

Prometheus学习

监控架构介绍&#xff1a; 基本架构&#xff1a; Prometheus 和 Zabbix 的对比&#xff1a; 安装和使用&#xff1a; Prometheus 采集、存储数据Grafana 用于图表展示alertmanager 用于接收 Prometheus 发送的警告信息node-exporter 用于收集操作系统和硬件信息的 metrics …

猫头虎 分享:Python库 Matplotlib 的简介、安装、用法详解入门教程

&#x1f42f; 猫头虎 分享&#xff1a;Python库 Matplotlib 的简介、安装、用法详解入门教程 今天猫头虎 带大家一起探索一个非常重要的 Python 库——Matplotlib。这是一个强大的工具&#xff0c;广泛应用于数据科学、人工智能和机器学习等领域&#xff0c;用于创建静态、动…

Node.js中的pipe方法:深入解析与应用指南

在Node.js中&#xff0c;pipe方法是处理流&#xff08;Stream&#xff09;数据的一种非常高效的方式。它允许你将一个可读流&#xff08;Readable Stream&#xff09;的数据直接传输到一个可写流&#xff08;Writable Stream&#xff09;中&#xff0c;而无需手动编写读取和写入…