关于windows API 的键鼠可控可测

相关函数解释

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 函数来处理可能的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LAOLONG-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值