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

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

#include
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这里不同。因为要使用INPUT这个联合体,网上资料没说是要#include,而是#include,如此便出现了许多变量未声明的错误。至今不知道为什么不能直接用#include,不过倒是明白为什么使用#include可以。

参见windows.h百度百科如下

#include

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;


你可能感兴趣的:(c++使用sendinput函数实现模拟键盘按键操作)