C++图形化打字模拟,单字依次输入(极简可行)

C++图形化打字模拟,单字依次输入(极简可行)
使用C进行打字模拟使用WindowsApplication项目进行开发。讨论一些问题和思路。对于输入需求是在指定情况下模拟人类单个字逐个输入。一.主要面对的技术问题及思考中文输入法里面例如搜狗输入法你只是键入了键盘按键大概率会有乱码。1.输入你输入的有几种形式中英文标点编码上它们是不同的字符拥有各自独立的编码。存储上在主流编码如UTF-8下占用的字节数不同。外观上中文标点通常是全角英文标点是半角中英文字符存储字节数在通用编码UTF-8下英文占 1 字节中文占 3 字节GBK下中文占2字节。宽度排版英文是半角窄中文是全角宽。在等宽字体下1个汉字 2个英文字母的宽度。身份码位在Unicode表中分属不同区域英文在拉丁区如A汉字在CJK区如汉它们是完全不同的字符。还有别的阿拉伯数字空格下划线特殊字符等。2.对于中文输入法的问题中文输入需要几个步骤以搜狗输入法为例你模拟键入就会经历以下步骤1.按键2.中文联想词和词库展示3.人类筛选属于“香农-韦弗”信息模型。程序模拟的话就没办法处理人类筛选这个功能除非你使用AI工具或者导入使用习惯和其他的数据。这样成本和复杂度会上升。二.解决很简单的方法就是判断中英文中文使用单字复制英文采取单字输入。1.SendInput发送单个 Unicode 字符基本逻辑//定义函数发送单字字符中英文都适用 void SendUnicodeChar(wchar_t ch) { // 定义函数接收一个宽字符参数用于模拟键盘输入该Unicode字符无返回值 INPUT input {0};// 声明一个INPUT结构体变量并初始化为零用于描述输入事件 input.type INPUT_KEYBOARD;// 设置输入事件类型为键盘事件而非鼠标或硬件事件 input.ki.wVk 0;// 虚拟键码设置为0因为使用Unicode方式发送字符时此字段被忽略 input.ki.wScan ch;// 将扫描码字段设置为要发送的Unicode字符值实际字符码 input.ki.dwFlags KEYEVENTF_UNICODE;// 设置标志位指示本次输入为Unicode字符非虚拟键码 SendInput(1, input, sizeof(INPUT));// 调用SendInput发送一个输入事件此处为按键按下事件参数事件数量、指针、结构体大小// 弹起 // 注释说明接下来发送按键弹起事件完成一次完整的按键动作 input.ki.dwFlags KEYEVENTF_UNICODE | KEYEVENTF_KEYUP; // 修改标志位增加KEYEVENTF_KEYUP表示按键弹起同时保留Unicode标志 SendInput(1, input, sizeof(INPUT)); // 再次调用SendInput发送弹起事件完成一个完整的字符输入 } // 函数结束2.模拟打字的主函数书写// 模拟打字主函数全部使用 Unicode 发送不再那么偏向使用剪贴板防止冲突 void SimulateTyping(const wchar_t* text, int intervalMs) { for (int i 0; text[i] ! L\0; i) { wchar_t ch text[i]; if (ch L\n || ch L\r) { // 模拟回车键 keybd_event(VK_RETURN, 0, 0, 0); Sleep(50); // 增加等待时间确保换行生效 keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0); } else { SendUnicodeChar(ch); } Sleep(intervalMs); } }三.改进可以图形化进行