模拟按键操作常用的方式有俩种:
使用winio模拟键盘硬件扫描码;
使用keybd_event函数。
第一种可能相对复杂,所以我并没有使用,不过想要弄明白它的原理,可以参考这篇文章:WinIo驱动级键盘模拟编程
因为我使用的第二种,所以我重点记录第二种怎么用。
Windows提供了一个模拟键盘API函数Keybd_event(),该函数可以合成一次击键事件,系统可以使用这种合成的击键事件来产生WM_KEYUP或者WM_KEYDOWN消息。
该函数原型如下:
VOID keybd_event(
BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);
1
2
3
4
5
6
7
8
9
10
11
该函数的四个参数分别为:
bVk:为按键的虚拟键值,键码值必须在1~254之间,例如F10的键值为121;
bScan:定义该键的硬件扫描码;
dwFlags:定义函数操作的各个方面的一个标志位集;
定义与击键相关的附加的32位值;
具体点,bVk为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab;bScan一般不用设置,用0代替就行。你是不是不明白键盘的虚拟码和硬件扫描码的区别,好,看这里键盘的扫描码、虚拟码。dwFlags应用程序可使用如下一些预定义常数的组合设置标志位。
KEYEVENTF_EXTENDEDKEY:若指定该值,则扫描码前一个值为OXEO(224)的前缀字节。
KEYEVENTF_KEYUP:若指定该值,该键将被释放(2);若未指定该值(0),该键将被按下。
dwFlags一般也是置0即可。
好了,弄明白系统提供的这个函数的功能以及参数了之后看看在C#中怎么用。比如模拟按下F10:
[DllImport("user32.dll"),EntryPoint = "keybd_event"]
public static extern void keybd_event(
byte bVk,
byte bScan,
int dwFlags, //这里为整数类型 0为按下,2为释放
int dwExtraInfo
);
public void F10Clic(){
//模拟F10按键
keybd_event((byte)Keys.F10,0,0,0); //按下F10
keybd_event((byte)Keys.F10,0,2,0); //按下后松开F10
}
1
2
3
4
5
6
7
8
9
10
11
12
13
好了,我的问题解决了。
最后附上常用的键值码表:
字母和数字键 数字小键盘的键 功能键 其它键
键 键码 键 键码 键 键码 键 键码
A 65 0 96 F1 112 Backspace 8
B 66 1 97 F2 113 Tab 9
C 67 2 98 F3 114 Clear 12
D 68 3 99 F4 115 Enter 13
E 69 4 100 F5 116 Shift 16
F 70 5 101 F6 117 Control 17
G 71 6 102 F7 118 Alt 18
H 72 7 103 F8 119 Caps Lock 20
I 73 8 104 F9 120 Esc 27
J 74 9 105 F10 121 Spacebar 32
K 75 * 106 F11 122 Page Up 33
L 76 + 107 F12 123 Page Down 34
M 77 Enter 108 – – End 35
N 78 - 109 – – Home 36
O 79 . 110 – – Left Arrow 37
P 80 / 111 – – Up Arrow 38
Q 81 – – – – Right Arrow 39
R 82 – – – – Down Arrow 40
S 83 – – – – Insert 45
T 84 – – – – Delete 46
U 85 – – – – Help 47
V 86 – – – – Num Lock 144
W 87
X 88
Y 89
Z 90
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
---------------------
作者:魏军强
来源:CSDN
原文:https://blog.csdn.net/u014434080/article/details/50838117
版权声明:本文为博主原创文章,转载请附上博文链接!