按键模拟

  1. keybd_event 函数
  2. WM_CHAR 消息模拟按键
  3. WM_IMG_CHAR 消息摸拟按键
  4. GetKeyState 按键状态
  5. GetKeyboardState 按键状态

keybd_event 函数

void keybd_event(BYTE bVk, BYTE bScan, DWORD dwFlags,DWORD dwExtraInfo)
参数 意义
bVk 虚拟键值,1-254
bScan 硬件扫描码,用 MapVirtualKey(bVk,0) 函数转换
dwFlags 标志
0 :按下键
KEYEVENTF_EXTENDEDKEY
KEYEVENTF_KEYUP :放开键
dwExtraInfo 扩展信息,一般为 0

示例:

// 模拟按键 Ctrl-Alt-Z
keybd_event(vk_control,mapvirtualkey(vk_control,0),0,0);
keybd_event(VK_LMENU,mapvirtualkey(VK_LMENU,0),0,0);
keybd_event(ord('Z'),mapvirtualkey(ord('Z'),0),0,0);
keybd_event(ord('Z'),mapvirtualkey(ord('Z'),0),keyeventf_keyup,0);
keybd_event(VK_LMENU,mapvirtualkey(VK_LMENU,0),keyeventf_keyup,0);
keybd_event(vk_control,mapvirtualkey(vk_control,0),keyeventf_keyup,0);
// 屏幕截图
keybd_event(vk_snapshot,0,0,0); // 截全屏
keybd_event(vk_snapshot,1,0,0); // 截当前窗口

扫描码转换函数

MapVirtualKey(UINT uCode, UINT uMapType)
参数 意义
uCode 欲转换的值
uMapType 转换方向:
0:虚拟键转扫描码
1:扫描码转虚拟键
2:虚拟键转扫描码(unshifted)
3:扫描码转虚拟键,区分左右手

WM_CHAR 消息模拟按键

参数 意义
hwnd 接收消息的窗口句柄
msg msg 按键消息
wParam VirtualKey 按键值

WM_CHAR : CharCode

lParam KeyData 标记

msg 消息

常量 意义
WM_KEYDOWN 键按下
WM_KEYUP 键放开
WM_CHAR 按键,此消息在 WM_KEYDOWN 后会自动发送

VirtualKey 键值

意义
48 - 57 数字键 0-9

KeyData 标记

意义
0-15 重复次数

WM_KEYUP 总是 1

16-23 扫描码
24 是否扩展码
25-28 保留
29 context code,总是 0
30 previous key state,消息发送以前的状态

WM_KEYUP 总是 1

31 transition state,键是否已放开

WM_KEYDOWN 总是 0
WM_KEYUP   总是 1

WM_IME_CHAR 消息模拟按键

直接发送文本到指定控件。

参数 意义
hwnd 接收消息的窗口句柄,一般为文本框
msg WM_IME_CHAR
wParam 字符内码,中文为双字节 16 位
lParam 0

GetKeyState 按键状态

GetKeyboardState 按键状态

Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal nVirtKey As Long) As Integer
参数 意义
nVirtKey 虚拟键编码
返回值 如果键被按下, 最高位(15)为 1

如果键对应的灯亮, 最低位(0) 为 1

Declare Function GetKeyboardState Lib "user32" Alias "GetKeyboardState" (pbKeyState As Byte) As Long
参数 意义
pbKeyState 填充字节数组, 大小 256
返回值 返回非零表示成功, 结果数组以虚拟键为下标取值:

如果键被按下, 最高位(7)为 1

如果键对应的灯亮, 最低位(0) 为 1