180108 逆向-Windows消息机制(键盘消息)

1625-5 王子昂 总结《2018年1月8日》 【连续第465天总结】
A. Windows消息系统-键盘消息
B.

键盘消息

概述

应用程序从系统接收到的关于键盘的消息可以分为两类:击键和字符。
物理层面上,对于某个按键(例如A),会发出“按下”和“弹起”两种消息,即击键消息
逻辑层面上,对于某个按键(例如A),按下以后会发出字符消息’A’

对于可以产生显示字符的击键,Windows不仅给程序发送击键消息,而且会发送字符消息
而对于不产生字符消息的击键,例如Shift、Alt等组合键、Esc、F1等功能键,都只会产生击键消息

击键消息

当按下某个按键时,Windows把WM_KEYDOWN或WM_SYSKEYDOW消息放入有输入焦点的窗口的消息队列中
当弹起某个按键时,Windows同样把WM_KEYUP或WM_SYSKEYUP消息放入队列中
有时会出现按住某个键不放的情况,此时Windows会把一系列的WM_KEYDOWN或WM_SYSKEYDOW放入队列中,直到释放把KEYUP放入队列

WM_SYSKEYDOW和WM_SYSKEYUP用于系统击键

系统击键

系统击键表示该击键对于Windows系统比对于应用程序更重要,例如Alt+F、Alt+TAB等

几乎所有会影响用户程序的消息都会先通过用户窗口过程函数
如果用户不处理且该消息为系统击键消息,则进入DefWindowProc默认窗口过程函数处理
如果是非系统击键消息则被忽略

如果用户自己的应用程序要处理系统击键消息,那么用户窗口过程函数处理后仍然可以交给DefWindowProc默认窗口过程函数来处理,当然也可以不转交

因此用户程序是可以屏蔽系统击键消息的,例如Alt+F4

但:Alt+Tab、Alt+Esc等消息不会发送给窗口,它们是Windows操作系统处理的消息,因此不会被用户程序屏蔽

虚拟键码

虚拟键码保存在WM_KEY系列消息的wParam参数中,代表发生操作的键
虚拟键码是相对于由硬件产生的扫描码而言的,不同的键盘可能会有不同的扫描码
但Windows接收到的是虚拟键码,(应该是由驱动进行的转换),从而屏蔽硬件之间的差异

扫描码的原理是
—5V—
-|-|-|-|-1
-|-|-|-|-1
-|-|-|-|-0
-|-|-|-|-1
1 1 0 1

列线一端接着5V高电平,行线则不断发出扫描信号:1110->1101->1011->0111
假设按下(2, 2),行线扫描到1101时,列线另一端的接收器会接收到1101(1代表高电平,0代表低电平)
此时根据扫描信号和接收信号就可以定位出被按下的键

lParam信息

lParam信息的32位分为6个域
0-15位为重复计数
16-23位为OEM扫描码
24-28位为拓展标志
29位为环境代码
30位为键的先前状态
31位为转换状态

击键消息时很少用到lParam

字符消息

字符消息通常是由TranlateMessage将击键消息转换而来的,分为WM_CHAR和WM_SYSCHAR
转换过后的MSG结构体中,wParam从原来的虚拟键码变为ASCII码或Unicode码,由注册窗口时的函数RegisterClassA/RegisterClassW决定

C. 明日计划
复习~
看书~
鼠标消息

你可能感兴趣的:(杂七杂八)