相关函数解释
GetAsyncKeyState 是 Windows API 中的一个函数,用于判断某个虚拟键是否被按下。GetAsyncKeyState(VK_ESCAPE) 专门用于检测 Esc 键的状态。下面为你详细介绍其用法:
函数原型
cpp
SHORT GetAsyncKeyState(
int vKey
);
参数
vKey:虚拟键码,对于 Esc 键,使用 VK_ESCAPE 作为参数。
返回值
返回一个 SHORT 类型的值,其含义如下:
最高位(第 15 位)为 1 时,表示该键当前处于按下状态;为 0 时,表示该键当前处于释放状态。
最低位(第 0 位)为 1 时,表示该键在最近一次调用 GetAsyncKeyState 之后被按下过;为 0 时,表示该键在最近一次调用之后没有被按下过。
示例代码
以下是一个简单的 C++ 示例,展示了如何使用 GetAsyncKeyState(VK_ESCAPE) 来检测 Esc 键的状态:
cpp
#include <iostream>
#include <windows.h>
int main() {
std::cout << "Press the Esc key to exit..." << std::endl;
while (true) {
// 检测 Esc 键的状态
SHORT state = GetAsyncKeyState(VK_ESCAPE);
// 检查最高位是否为 1,即 Esc 键是否被按下
if (state & 0x8000) {
std::cout << "Esc key is pressed. Exiting..." << std::endl;
break;
}
// 可以在这里添加其他代码,处理其他任务
Sleep(10); // 短暂休眠,减少 CPU 占用
}
return 0;
}
代码解释
引入必要的头文件:windows.h 包含了 GetAsyncKeyState 函数的声明,iostream 用于输入输出操作。
进入循环:在 while (true) 循环中不断检测 Esc 键的状态。
检测 Esc 键状态:调用 GetAsyncKeyState(VK_ESCAPE) 函数获取 Esc 键的状态,并将结果存储在 state 变量中。
检查最高位:使用按位与运算符 & 检查 state 的最高位是否为 1。如果为 1,则表示 Esc 键被按下,输出提示信息并退出循环。
短暂休眠:使用 Sleep(10) 函数让程序暂停 10 毫秒,减少 CPU 占用。
注意事项
GetAsyncKeyState 是异步的,它返回的是调用时键的状态,而不是在某个特定消息处理过程中的状态。
由于该函数是异步的,可能会出现按键抖动的问题。在实际应用中,可以根据需要添加防抖处理。
虚拟键码 对应值 对应键
对应键值
VK_LBUTTON 1 鼠标左键
VK_RBUTTON 2 鼠标右键
VK_CANCEL 3 Cancel
VK_MBUTTON 4 鼠标中键
VK_XBUTTON1 5
VK_XBUTTON2 6
VK_BACK 8 Backspace
VK_TAB 9 Tab
VK_CLEAR 12 Clear
13 Enter
VK_SHIFT 16 Shift
VK_CONTROL 17 Ctrl
VK_MENU 18 Alt
VK_PAUSE 19 Pause
VK_CAPITAL 20 Caps Lock
VK_KANA 21
VK_HANGUL 21
VK_JUNJA 23
VK_FINAL 24
VK_HANJA 25
VK_KANJI 25*
VK_ESCAPE 27 Esc
VK_CONVERT 28
VK_NONCONVERT 29
VK_ACCEPT 30
VK_MODECHANGE 31
VK_SPACE 32 Space
VK_PRIOR 33 Page Up
VK_NEXT 34 Page Down
VK_END 35 End
VK_HOME 36 Home
VK_LEFT 37 Left Arrow
VK_UP 38 Up Arrow
VK_RIGHT 39 Right Arrow
VK_DOWN 40 Down Arrow
VK_SELECT 41 Select
VK_PRINT 42 Print
VK_EXECUTE 43 Execute
VK_SNAPSHOT 44 Snapshot
VK_INSERT 45 Insert
VK_DELETE 46 Delete
VK_HELP 47 Help
48 0
49 1
50 2
51 3
52 4
53 5
54 6
55 7
56 8
57 9
65 A
66 B
67 C
68 D
69 E
70 F
71 G
72 H
73 I
74 J
75 K
76 L
77 M
78 N
79 O
80 P
81 Q
82 R
83 S
84 T
85 U
86 V
87 W
88 X
89 Y
90 Z
VK_LWIN 91
VK_RWIN 92
VK_APPS 93
VK_SLEEP 95
VK_NUMPAD0 96 小键盘 0
VK_NUMPAD1 97 小键盘 1
VK_NUMPAD2 98 小键盘 2
VK_NUMPAD3 99 小键盘 3
VK_NUMPAD4 100 小键盘 4
VK_NUMPAD5 101 小键盘 5
VK_NUMPAD6 102 小键盘 6
VK_NUMPAD7 103 小键盘 7
VK_NUMPAD8 104 小键盘 8
VK_NUMPAD9 105 小键盘 9
VK_MULTIPLY 106 小键盘 *
VK_ADD 107 小键盘 +
VK_SEPARATOR 108 小键盘 Enter
VK_SUBTRACT 109 小键盘 -
VK_DECIMAL 110 小键盘 .
VK_DIVIDE 111 小键盘 /
VK_F1 112 F1
VK_F2 113 F2
VK_F3 114 F3
VK_F4 115 F4
VK_F5 116 F5
VK_F6 117 F6
VK_F7 118 F7
VK_F8 119 F8
VK_F9 120 F9
VK_F10 121 F10
VK_F11 122 F11
VK_F12 123 F12
VK_F13 124
VK_F14 125
VK_F15 126
VK_F16 127
VK_F17 128
VK_F18 129
VK_F19 130
VK_F20 131
VK_F21 132
VK_F22 133
VK_F23 134
VK_F24 135
VK_NUMLOCK 144 Num Lock
VK_SCROLL 145 Scroll
VK_LSHIFT 160
VK_RSHIFT 161
VK_LCONTROL 162
VK_RCONTROL 163
VK_LMENU 164
VK_RMENU 165
VK_BROWSER_BACK 166
VK_BROWSER_FORWARD 167
VK_BROWSER_REFRESH 168
VK_BROWSER_STOP 169
VK_BROWSER_SEARCH 170
VK_BROWSER_FAVORITES 171
VK_BROWSER_HOME 172
VK_VOLUME_MUTE 173 VolumeMute
VK_VOLUME_DOWN 174 VolumeDown
VK_VOLUME_UP 175 VolumeUp
VK_MEDIA_NEXT_TRACK 176
VK_MEDIA_PREV_TRACK 177
VK_MEDIA_STOP 178
VK_MEDIA_PLAY_PAUSE 179
VK_LAUNCH_MAIL 180
VK_LAUNCH_MEDIA_SELECT 181
VK_LAUNCH_APP1 182
VK_LAUNCH_APP2 183
VK_OEM_1 186 ; :
VK_OEM_PLUS 187 = +
VK_OEM_COMMA 188
VK_OEM_MINUS 189 - _
VK_OEM_PERIOD 190
VK_OEM_2 191 / ?
VK_OEM_3 192 ` ~
VK_OEM_4 219 [ {
VK_OEM_5 220 \
VK_OEM_6 221 ] }
VK_OEM_7 222 引号
VK_OEM_8 223
VK_OEM_102 226
VK_PACKET 231
VK_PROCESSKEY 229
VK_ATTN 246
VK_CRSEL 247
VK_EXSEL 248
VK_EREOF 249
VK_PLAY 250
VK_ZOOM 251
VK_NONAME 252
VK_PA1 253
VK_OEM_CLEAR 254
代码块
模拟按键
而实际使用模拟按键只需按下和放下(有时需要在这两个操作之中放入延时)
#include<stdio.h>;
#include<windows.h>
keybd_event(122, 0, 0, 0);
keybd_event(122, 0, KEYEVENTF_KEYUP, 0);
组合键
keybd_event(VK_LWIN, 0, 0 ,0);
keybd_event('R', 0, 0 ,0);
keybd_event('R', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);
以及上述这四行用于win + 各种键的组合键!!
鼠标操作
POINT p;
SetCursorPos(1577, 346);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
鼠标滑动操作
#include <windows.h>
#include <stdio.h>
#include<unistd.h>
#include<conio.h>
#include <math.h>
int zx(int x1,int y1,int x2,int y2)
{
POINT p;
int x;
SetConsoleTitle("5082.txt");
usleep(200000);
SetCursorPos(x1, y1);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
usleep(200000);
SetCursorPos(x2,y2);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}
int main()
{
zx(1577,346,1125,685);
zx(1135,304,1557,801);
return 0;
}
若keybd_event函数已被系统弃用,则使用SendInput函数
SendInput 函数是 Windows API 中的一个重要函数,用于模拟用户输入事件,包括键盘和鼠标操作。它比旧的 keybd_event 和 mouse_event 函数更强大、更可靠,并且在现代 Windows 系统中被推荐使用。下面将对 SendInput 函数进行详细介绍。
函数原型
c
UINT SendInput(
UINT cInputs,
LPINPUT pInputs,
int cbSize
);
参数说明
cInputs
类型:UINT
描述:pInputs 数组中 INPUT 结构体的数量,即要模拟的输入事件的数量。
pInputs
类型:LPINPUT(指向 INPUT 结构体数组的指针)
描述:一个指向 INPUT 结构体数组的指针,每个 INPUT 结构体代表一个输入事件,如键盘按键、鼠标移动或鼠标点击等。
cbSize
类型:int
描述:INPUT 结构体的大小,通常使用 sizeof(INPUT) 来获取。
返回值
类型:UINT
描述:函数返回实际插入到输入队列中的输入事件的数量。如果返回值与 cInputs 不相等,则表示出现了错误。可以使用 GetLastError 函数来获取具体的错误代码。
INPUT 结构体
INPUT 结构体用于描述一个输入事件,其定义如下:
c
typedef struct tagINPUT {
DWORD type;
union {
MOUSEINPUT mi;
KEYBDINPUT ki;
HARDWAREINPUT hi;
};
} INPUT, *PINPUT, *LPINPUT;
type:指定输入事件的类型,可以是以下值之一:
INPUT_MOUSE:表示鼠标事件。
INPUT_KEYBOARD:表示键盘事件。
INPUT_HARDWARE:表示硬件事件,通常很少使用。
联合部分:根据 type 的值,使用不同的结构体来描述具体的输入事件。
MOUSEINPUT:用于描述鼠标事件,如鼠标移动、鼠标点击等。
KEYBDINPUT:用于描述键盘事件,如按键按下、按键释放等。
HARDWAREINPUT:用于描述硬件事件。
示例代码
模拟键盘按键
c
#include <windows.h>
#include <stdio.h>
重点就在于这两个函数的使用
// 模拟按键按下
// 模拟按键按下
void pressKey(WORD keyCode) {
INPUT input = {0};
input.type = INPUT_KEYBOARD;
input.ki.wVk = keyCode;
SendInput(1, &input, sizeof(INPUT));
}
// 模拟按键释放
void releaseKey(WORD keyCode) {
INPUT input = {0};
input.type = INPUT_KEYBOARD;
input.ki.wVk = keyCode;
input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &input, sizeof(INPUT));
}
int main() {
// 按下 'A' 键
pressKey('A');
// 等待一段时间
Sleep(500);
// 释放 'A' 键
releaseKey('A');
return 0;
}
模拟鼠标点击
c
#include <windows.h>
#include <stdio.h>
int main() {
INPUT input = {0};
input.type = INPUT_MOUSE;
input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
// 按下鼠标左键
SendInput(1, &input, sizeof(INPUT));
Sleep(500);
input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
// 释放鼠标左键
SendInput(1, &input, sizeof(INPUT));
return 0;
}
注意事项
权限问题:在某些情况下,模拟输入事件可能需要管理员权限,特别是在系统受保护的区域或应用程序中。
兼容性:SendInput 函数在现代 Windows 系统中具有良好的兼容性,但在一些特殊环境或虚拟机中可能会受到限制。
错误处理:在使用 SendInput 函数时,建议检查返回值并使用 GetLastError 函数来处理可能的错误。