12.2 实现键盘模拟按键

本节将向读者介绍如何使用键盘鼠标操控模拟技术,键盘鼠标操控模拟技术是一种非常实用的技术,可以自动化执行一些重复性的任务,提高工作效率,在系统下,通过使用各种键盘鼠标控制函数实现动态捕捉和模拟特定功能的操作 。
键盘鼠标的模拟是实现自动化的必备流程,通常我们可以使用()实现对键盘的击键模拟,使用()实现对鼠标的模拟,使用两者的配合读者可以很容易的实现对键盘鼠标的控制,本节将依次封装实现,模拟键盘鼠标控制功能,读者可根据自己的实际需求选用不同的函数片段 。
12.2.1 模拟键盘按键
模拟按键的核心功能是通过调用()函数实现的,如下是这段代码的完整实现,首先()函数该函数用于设置键盘状态是否为大小写,用户可以传入一个状态值来设置当前输入法大小写模式,()函数用于实现模拟键盘按键,该函数接收一个英文字符串,并自动实现击键操作,代码实现并不复杂,读者可自行测试功能 。
#include #include using namespace std;// 设置键盘大小写状态 为TRUE则切换大写状态,否则切换小写状态VOID MySetKeyBig(BOOL big = FALSE){// 判断键盘CapsLock键是否开启状态,开启状态则为大写,否则为小写if (GetKeyState(VK_CAPITAL)){// 如果当前键盘状态为大写,要求改小写,则模拟按键CapsLock切换状态if (!big){keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}std::cout << "[键盘状态] " << "切换大写" << std::endl;}else{// 如果当前键盘状态为小写,要求改大写,则模拟按键CapsLock切换状态if (big){keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}std::cout << "[键盘状态] " << "切换小写" << std::endl;}}// 模拟键盘按键VOID MyAnalogKey(char* str){int iLen = 0;char* tmp = NULL;INPUT* keys = NULL;BOOL bOldState = FALSE;// 保存此操作前的键盘状态bOldState = (BOOL)GetKeyState(VK_CAPITAL);iLen = lstrlen(str);tmp = (char*)malloc(iLen);memmove(tmp, str, iLen);for (int i = 0; i < iLen; i++){// 某些符号非直属键盘按键,这里只过滤转换两个,以后用到其它字符自行添加过滤if (tmp[i] == ' '){// 产生一个击键消息步骤:按下->抬起keybd_event(VK_SPACE, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event(VK_SPACE, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}else if (tmp[i] == ','){keybd_event(VK_OEM_COMMA, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event(VK_OEM_COMMA, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}else if (tmp[i] >= 'a' && tmp[i] <= 'z'){// 根据字符大小写切换键盘大小写状态MySetKeyBig(0);// keybd_event只识别大写keybd_event((BYTE)tmp[i] - 32, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event((BYTE)tmp[i] - 32, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}else if ((tmp[i] >= 'A' && tmp[i] <= 'Z') || (tmp[i] >= '0' && tmp[i] <= '9')){MySetKeyBig(1);keybd_event((BYTE)tmp[i], NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event((BYTE)tmp[i], NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}else{keybd_event((BYTE)tmp[i] + 64, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);keybd_event((BYTE)tmp[i] + 64, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);}Sleep(50);}// 恢复此操作之前的键盘状态MySetKeyBig(bOldState);free(tmp);}int main(int argc, char *argv[]){Sleep(5000);MyAnalogKey((char*)"Love life , Love LyShark WelCome LyShark Cpp Home ...");system("pause");return 0;}
读者可自行编译并运行上述代码片段,将光标移动到记事本中,等待五秒钟,则会依次敲击如下所示的键盘按键;
12.2.2 设置窗体最大化
如下代码实现了设置一个窗体置顶并将该窗体最大化显示的效果,该代码实现原理是通过使用函数传递一个回调函数,实现对特定窗体的枚举,当找到对应窗体句柄后则将该窗体句柄传递给全局句柄中,当获取到浏览器句柄之后则通过函数得到当前全屏窗体的像素比,通过调用可将一个窗体设置为置顶显示,最后可调用函数向特定窗体句柄发送最大化消息,使其填充满整个屏幕,代码如下所示;