虚拟键码和windows消息分析

2024-03-16 16:18

本文主要是介绍虚拟键码和windows消息分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大多数虚拟键码的名称在WINUSER.H表头档案中都定义为以VK_开头。如下

#ifndef NOVIRTUALKEYCODES

 

// begin_r_winuser

 

/*

 *Virtual Keys, Standard Set

 */

#define VK_LBUTTON        0x01

#define VK_RBUTTON        0x02

#define VK_CANCEL         0x03

#define VK_MBUTTON        0x04   /* NOT contiguous with L & RBUTTON */

 

#define VK_BACK           0x08

#define VK_TAB            0x09

 

#define VK_CLEAR          0x0C

#define VK_RETURN         0x0D

 

#define VK_SHIFT          0x10

#define VK_CONTROL        0x11

#define VK_MENU           0x12

#define VK_PAUSE          0x13

#define VK_CAPITAL        0x14

 

#define VK_KANA           0x15

#define VK_HANGEUL        0x15 /* old name - should be here for compatibility */

#define VK_HANGUL         0x15

#define VK_JUNJA          0x17

#define VK_FINAL          0x18

#define VK_HANJA          0x19

#define VK_KANJI          0x19

 

#define VK_ESCAPE         0x1B

 

#define VK_CONVERT        0x1C

#define VK_NONCONVERT     0x1D

#define VK_ACCEPT         0x1E

#define VK_MODECHANGE     0x1F

 

#define VK_SPACE          0x20

#define VK_PRIOR          0x21

#define VK_NEXT           0x22

#define VK_END            0x23

#define VK_HOME           0x24

#define VK_LEFT           0x25

#define VK_UP             0x26

#define VK_RIGHT          0x27

#define VK_DOWN           0x28

#define VK_SELECT         0x29

#define VK_PRINT          0x2A

#define VK_EXECUTE        0x2B

#define VK_SNAPSHOT       0x2C

#define VK_INSERT         0x2D

#define VK_DELETE         0x2E

#define VK_HELP           0x2F

 

/* VK_0 thru VK_9 are the same as ASCII '0'thru '9' (0x30 - 0x39) */

/* VK_A thru VK_Z are the same as ASCII 'A'thru 'Z' (0x41 - 0x5A) */

 

#define VK_LWIN           0x5B

#define VK_RWIN           0x5C

#define VK_APPS           0x5D

 

#define VK_NUMPAD0        0x60

#define VK_NUMPAD1        0x61

#define VK_NUMPAD2        0x62

#define VK_NUMPAD3        0x63

#define VK_NUMPAD4        0x64

#define VK_NUMPAD5        0x65

#define VK_NUMPAD6        0x66

#define VK_NUMPAD7        0x67

#define VK_NUMPAD8        0x68

#define VK_NUMPAD9        0x69

#define VK_MULTIPLY       0x6A

#define VK_ADD            0x6B

#define VK_SEPARATOR      0x6C

#define VK_SUBTRACT       0x6D

#define VK_DECIMAL        0x6E

#define VK_DIVIDE         0x6F

#define VK_F1             0x70

#define VK_F2             0x71

#define VK_F3             0x72

#define VK_F4             0x73

#define VK_F5             0x74

#define VK_F6             0x75

#define VK_F7             0x76

#define VK_F8             0x77

#define VK_F9             0x78

#define VK_F10            0x79

#define VK_F11            0x7A

#define VK_F12            0x7B

#define VK_F13            0x7C

#define VK_F14            0x7D

#define VK_F15            0x7E

#define VK_F16            0x7F

#define VK_F17            0x80

#define VK_F18            0x81

#define VK_F19            0x82

#define VK_F20            0x83

#define VK_F21            0x84

#define VK_F22            0x85

#define VK_F23            0x86

#define VK_F24            0x87

 

#define VK_NUMLOCK        0x90

#define VK_SCROLL         0x91

 

/*

 *VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.

 *Used only as parameters to GetAsyncKeyState() and GetKeyState().

 * Noother API or message will distinguish left and right keys in this way.

 */

#define VK_LSHIFT         0xA0

#define VK_RSHIFT         0xA1

#define VK_LCONTROL       0xA2

#define VK_RCONTROL       0xA3

#define VK_LMENU          0xA4

#define VK_RMENU          0xA5

 

#if(WINVER >= 0x0400)

#define VK_PROCESSKEY     0xE5

#endif /* WINVER >= 0x0400 */

 

#define VK_ATTN           0xF6

#define VK_CRSEL          0xF7

#define VK_EXSEL          0xF8

#define VK_EREOF          0xF9

#define VK_PLAY           0xFA

#define VK_ZOOM           0xFB

#define VK_NONAME         0xFC

#define VK_PA1            0xFD

#define VK_OEM_CLEAR      0xFE

 

// end_r_winuser

 

#endif /* !NOVIRTUALKEYCODES */


windows消息的分类:

1 WM_PAINT消息

LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高

2 滚动条WM_VSCROLLWM_HSCROLL消息

LOWORD(wParam)指出了鼠标对滚动条的操作。比如上、下、左、右、翻页、移动等。 

3 击键消息,有WM_SYSKEYDOWNWM_SYSKEYUPWM_KEYUPWM_KEYDOWN

其中wParam是虚拟键代码,lParam是包含属于击键的其他信息。lParam消息参数分为7个域,下图进行详细说明。 

4 字符消息WM_CHARWM_DEADCHARWM_SYSCHARWM_SYSDEADCHAR

lParam消息参数跟击键消息的lParam消息参数内容相同,wParam参数是ANSIUnicode字符代码 

5 客户区鼠标消息WM_LBUTTONDOWNWM_LBUTTONUPWM_RBUTTONDOWNWM_RBUTTONUPWM_MBUTTONDOWNWM_MBUTTONUP

lParam参数的低位是鼠标的客户区x坐标,高位是客户区y坐标。wParam参数是指示鼠标键及ShiftCtrl键的状态。wParam&MK_SHIFTMK_CTRL,如果返回TRUE就意味着有按下ShiftCtrl键。

6 非客户区消息

wParam参数指明移动或者单击鼠标键的非客户区位置,以HT开头,lParam参数低位指出了鼠标所在屏幕坐标的x坐标,高位指出了鼠标所在屏幕坐标的y坐标。

7 鼠标轮滚动消息,WM_MOUSEWHEEL消息

lParam将获得鼠标的屏幕位置(坐标),wParam参数的低位表明鼠标键和ShiftCtrl键的状态。HIWORD(wParam)值可正可负,指出了滚轮导致屏幕滚动几行,是WHEEL_DELTA(120)的倍数

8 计时器消息WM_TIMER

wParam参数等于计时器的ID值,lParam0

9 按钮子窗口的WM_COMMAND消息

wParam参数的低位是子窗口ID,高位是通知码, lParam参数是子窗口句柄。

10 焦点消息,对于正在失去焦点的窗口,会收到WM_KILLFOCUS消息

其wParam参数是即将接收输入焦点的窗口的句柄。对于即将获取焦点的窗口,会收到WM_SETFOCUS消息,其wParam参数是正在失去焦点的窗口的句柄。

11 编辑控制的WM_COMMAND消息

wParam参数的低位是子窗口ID,高位是通知码,lParam参数是子窗口句柄。

12 列表框的WM_COMMAND消息

wParam参数的低位是子窗口ID,高位是通知码,lParam参数是子窗口句柄。

13 菜单消息1,WM_INITMENU

wParam是主菜单句柄,lParam是0.

14 菜单消息2,WM_MENUSELECT,菜单跟踪消息

其wParam参数的低位是选中项菜单的ID或者弹出式菜单的句柄,高位是选择标识,lParam参数是包含选中项的菜单句柄。

15 菜单消息3,WM_INITMENUPOPUP,准备显示一个弹出式菜单时产生的消息

wParam参数是弹出式菜单的句柄,lParam的低位是弹出式菜单的索引,如果该菜单是系统菜单,那么高位是1,否则为0.

16 菜单消息4,WM_COMMAND,选中菜单后产生

wParam低位是击中菜单的ID,高位是0,lParam参数也是0



当一个非系统键被按下时该消息发送给具有键盘焦点的窗口。非系统键即不与ALT联用的情况。

wParam为虚拟键码:WM_KEYDOWN

  lParam 的定义如下:



这篇关于虚拟键码和windows消息分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816014

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4