21xrx.com
2024-12-22 19:40:58 Sunday
登录
文章检索 我的文章 写文章
C++模拟键盘实现
2023-07-01 17:15:28 深夜i     --     --
C++ 模拟 键盘 实现

C++模拟键盘实现方法

C++作为一门强大的编程语言,可以实现很多功能,其中模拟键盘功能是较为实用的功能之一。在很多应用场合中,需要通过软件模拟键盘按键,比如自动化测试、游戏外挂等应用场景。下面我们来介绍几种C++模拟键盘的实现方法。

一、使用SendInput函数实现模拟键盘

SendInput 函数是 Windows API 中的一个函数,它可以将模拟的键盘、鼠标等输入数据发送到系统的输入队列中。模拟按键可以使用 SendInput 函数实现,具体使用方法如下:

1. 头文件和命名空间:


#include <Windows.h>

#include <iostream>

using namespace std;

2. 定义模拟按键结构体:


typedef struct tagINPUT {

  DWORD type;

  union

    MOUSEINPUT   mi;

    KEYBDINPUT   ki;

    HARDWAREINPUT  hi;

   DUMMYUNIONNAME;

} INPUT, *PINPUT, *LPINPUT;

3. 定义按键码:


#define KEY_SCANCODE_SPACE 0x39

#define KEY_SCANCODE_A 0x41

#define KEY_SCANCODE_B 0x42

//按照需求定义需要模拟的按键

4. 通过 SendInput 函数模拟按键:


void SimulateKeyPress(WORD vkCode) {

  INPUT Input ={};

  Input.type = INPUT_KEYBOARD;

  Input.ki.wVk = vkCode;

  Input.ki.dwFlags = 0;

  SendInput(1, &Input, sizeof(INPUT));

}

void SimulateKeyRelease(WORD vkCode) {

  INPUT Input ={};

  Input.type = INPUT_KEYBOARD;

  Input.ki.wVk = vkCode;

  Input.ki.dwFlags = KEYEVENTF_KEYUP;

  SendInput(1, &Input, sizeof(INPUT));

}

void PressKey(WORD vkCode, int delay) {

  SimulateKeyPress(vkCode);

  Sleep(delay);

  SimulateKeyRelease(vkCode);

}

5. 调用 PressKey 函数按照定义模拟按键:


int main() {

  PressKey(KEY_SCANCODE_A, 500);

  PressKey(KEY_SCANCODE_B, 500);

  PressKey(KEY_SCANCODE_SPACE, 500);

  return 0;

}

二、使用WinAPI message 实现模拟键盘

两种模拟键盘的方法都是基于WindowsAPI,除了使用 SendInput 函数模拟按键外,还可以使用 WinAPI message 实现模拟。具体步骤如下:

1. 定义模拟按键的函数:


void simulateKeyPress(UINT vkCode, HWND window) {

  SendMessage(window, WM_KEYDOWN, vkCode, 0);

}

void simulateKeyRelease(UINT vkCode, HWND window) {

  SendMessage(window, WM_KEYUP, vkCode, 0);

}

void SimulateKey(UINT vkCode, HWND window, int delay) {

  simulateKeyPress(vkCode, window);

  Sleep(delay);

  simulateKeyRelease(vkCode, window);

}

2. 调用 SimulateKey 函数模拟按键:


SimulateKey('A', window, 1000);

SimulateKey('B', window, 1000);

以上就是两种创造C++模拟键盘的方法,开发者可以根据自己的需求进行选择使用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复