c++使用sendinput函数实现模拟键盘按键操作

十分简单的一段程序,观者勿笑。对于没接触过window编程的我,却是花费了一定时间。主要是有一个坑,记录如下。我是用的是visual studio2017创建了一个windows控制台程序。代码如下:

#include<Windows.h>
int main()
{
INPUT input[4];
memset(input, 0, sizeof(input));


input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;  //设置键盘模式  


input[0].ki.wVk = input[3].ki.wVk = VK_LWIN;
input[1].ki.wVk = input[2].ki.wVk = 'D';


input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;


SendInput(4, input, sizeof(INPUT));
    return 0;
}

该程序模拟的是按下win+D键,在win10系统下就是隐藏桌面所有窗口。运行程序即可看到效果。在这里我要记录下我所踩的坑,要实现这个功能我在网上所找到的资料代码是相同的,主要是#include<windows.h>这里不同。因为要使用INPUT这个联合体,网上资料没说是要#include<windows.h>,而是#include<winuser.h>,如此便出现了许多变量未声明的错误。至今不知道为什么不能直接用#include<winuser.h>,不过倒是明白为什么使用#include<windows.h>可以。

参见windows.h百度百科如下

#include <windows.h>

WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件。这些头文件中最重要的和最基本的是:

WINDEF.H 基本数据类型定义。

WINNT.H 支持Unicode的类型定义。

WINBASE.H Kernel(内核)函数。

WINUSER.H 用户界面函数。

WINGDI.H 图形设备接口函数。

这些头文件定义了Windows的所有资料型态、函数调用、资料结构和常数识别字,它们是Windows文件中的一个重要部分。

由上可知windows.h已经包含了winuser.h,故可使程序正常运行。


此外,再记录下sendinput这个函数吧,如下:

UINT SendInput(  UINT nInputs,   LPINPUT pInputs,   int cbSize ); 


函数说明:

该函数合成键盘事件和鼠标事件,用来模拟鼠标或者键盘操作。事件将被插入在鼠标或者键盘处理队列里面。


参数说明:

nInputs 指定ninput 数组中元素的个数。就是插入事件的个数。

pInputs 指向一个类型为INPUT的 数组变量,该数组中的每个元素代表一个将要插入到线程事件中去的键盘或鼠标事件。

cbSize 指定INPUT结构的大小。如果cbSize不是INPUT结构的大小,则函数将失败返回。


注意事项:

注意到插入的是INPUT结构的事件。故应该继续查看INPUT的相关内容。

typedef struct tagINPUT {

DWORD ; union {

MOUSEINPUT mi ;

KEYBDINPUT ;

HARDWAREINPUT ; };

} INPUT, *PINPUT, FAR* LPINPUT;


typedef struct tagKEYBDINPUT{

WORD wVk;

        WORD wScan;

  DWORD dwFlags;

DWORD time;

ULONG PTR dwExtraInfo;

}KEYBDINPUT,*PKEYBDINPUT,FAR* LPKEYBDINPUT;


  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DaiCharlie

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

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

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

打赏作者

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

抵扣说明:

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

余额充值