当前位置: 首页 > news >正文

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

使用C++进行打字模拟,使用WindowsApplication项目进行开发。讨论一些问题和思路。对于输入需求是在指定情况下模拟人类单个字逐个输入。

一.主要面对的技术问题及思考

中文输入法里面,例如搜狗输入法,你只是键入了键盘按键,大概率会有乱码。

1.输入

你输入的有几种形式,中英文标点:

  • 编码上:它们是不同的字符,拥有各自独立的编码。

  • 存储上:在主流编码(如UTF-8)下,占用的字节数不同

  • 外观上:中文标点通常是全角,英文标点是半角

中英文字符:

  1. 存储(字节数):在通用编码UTF-8下,英文占 1 字节中文占 3 字节(GBK下中文占2字节)。

  2. 宽度(排版):英文是半角(窄),中文是全角(宽)。在等宽字体下,1个汉字 = 2个英文字母的宽度。

  3. 身份(码位):在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); } }

三.改进

可以图形化进行

http://www.jsqmd.com/news/1128512/

相关文章:

  • YOLO11目标检测入门:猜拳识别实战指南
  • 【SpringBoot篇】SpringBoot WebFlux响应式大文件流式上传下载实战(Flux<DataBuffer>低内存原理、源码解析、落地方案)
  • 医用修护敷料选购指南:资质、成分与剂型的硬核拆解
  • 基于 Java Swing + MySQL C/S 即时通讯聊天系统完整开发记录
  • TensorRT量化模型部署实战:从QAT到INT8推理的工程陷阱
  • 【Java项目-企悦抽】02-AI赋能产品需求规格说明书
  • 吃透SQL查询优化:真实线上案例+Explain深度解析
  • 企业级Java电商系统选型路线图:从零到上线全流程拆解
  • 小学期十八周
  • 第十八周小学期
  • 前端工程化-02:一个完整的vue工程结构模板
  • lsm6dsv16x
  • 开源商城源码下载后能商用吗?这3款Apache-2.0协议商城放心用
  • 卫星被云挡住后,AI还能知道洪水淹到哪里吗?
  • 15-DifusionMOT:一种基于扩散算法的多目标跟踪器
  • STM32与LV3296条形码模块的硬件协同与优化方案
  • 【花雕动手做】行空板 K10 系列实验之 TT 马达四驱动全向福来轮语音控制智能小车
  • NohBoard:重新定义键盘操作可视化的创新解决方案
  • 高精度电压管理系统设计与STM32实现
  • 高效智能的Windows ADB驱动一键安装解决方案
  • 大模型技术实战:AIGC与Agent智能体开发指南
  • 纯电动汽车骑车辅件介绍
  • 智能生成WebUI自动化测试用例:从意图理解到代码生成的全链路实践
  • Claude Code Session 恢复机制详解,从 --continue 到 /resume 的工程化工作流
  • HiveWE:魔兽争霸III地图编辑器的现代化革命,告别卡顿拥抱流畅创作
  • 手工排班太痛苦?这款免费智能排班系统,一键生成排班表还能导出Excel
  • 总目录 2026版国家级全领域科研痛点攻关
  • web安全-PHP反序列化漏洞
  • Agent 工作流编排:从 DAG 到动态规划
  • 1:配置git