MFC 在光标所在位置输入文字(不同应用程序之间)
来源:互联网 发布:java web 项目书籍pdf 编辑:程序博客网 时间:2024/05/16 01:40
写在前面
哈哈,最近接到了一个比较有意思的任务,就是让我做一个语音输入的小程序,程序在Windows上面,通过安卓手机来进行语音识别。想想都有点小激动,但是怎么将文字转入到其他的程序呢?这是个问题。感谢谷歌以及国内的一位大神,他的博客的地址:http://blog.sina.com.cn/s/blog_561c033c0100ivgf.html
正文
很早以前写了一个刷卡程序,功能是定时监控读卡器,当发现有IC卡放到读卡器上后,自动识别出卡号,然后带着这个卡号搜索一个英文用户名和卡号的对照表,最后把英文用户名直接自动输入到当前光标所在的位置。本来程序一直用得好好的,可是最近遇到了一个新问题——因为用户名现在居然可以用中文了!所以这下麻烦大了……
原先实现英文的自动输入,用的是keybd_event函数,直接模拟键盘事件。但是要输入中文,貌似没有输入法还是不行,难道还要我先用keybd_event调出输入法,然后输入拼音?这个思路想想就很恐怖,所以赶紧就上网搜解决方案去了。可是搜了一圈下来,只有寥寥几篇提到解决方案,虽然网上搜索结果众多,但是基本上就是这几个版本贴来贴去,浪费了我好多时间。
不幸的事情还在后头,虽然有人提到SendInput函数可以输入中文,但是语焉不详,按照他提供的点滴的代码,我死活就是没有试出来。所以最后中文搜索的结果,除了认识了这个SendInput函数之外,没有更多的收获。后来不死心,换了英文搜索,还真找到了一个比较接近我需求的,老外写的VB版本的SendInput的例子,试验了以下,果然可以输入中文。大喜之下,决定花点时间研究一下人家的源代码,然后写一个VC的版本。
摸索了两天之后,发现实现中文自动输入还真不难,因为SendInput确实支持,所以终于可以不用输入法了,万幸。特意整理了几个函数,共享一下。
首先是,头文件必须包含以下两个:
#include <winable.h>#include <atlconv.h>
前者是SendInput函数要用到,后者是字符串转换的时候要用到。
void SendAscii(wchar_t data, BOOL shift){ INPUT input[2]; memset(input, 0, 2 * sizeof(INPUT)); if (shift) { input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = VK_SHIFT; SendInput(1, input, sizeof(INPUT)); } input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = data; input[1].type = INPUT_KEYBOARD; input[1].ki.wVk = data; input[1].ki.dwFlags = KEYEVENTF_KEYUP; SendInput(2, input, sizeof(INPUT)); if (shift) { input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = VK_SHIFT; input[0].ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, input, sizeof(INPUT)); }}void SendUnicode(wchar_t data){ INPUT input[2]; memset(input, 0, 2 * sizeof(INPUT)); input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = 0; input[0].ki.wScan = data; input[0].ki.dwFlags = 0x4;//KEYEVENTF_UNICODE; input[1].type = INPUT_KEYBOARD; input[1].ki.wVk = 0; input[1].ki.wScan = data; input[1].ki.dwFlags = KEYEVENTF_KEYUP | 0x4;//KEYEVENTF_UNICODE; SendInput(2, input, sizeof(INPUT));}//为方便使用,下面这个函数包装了前两个函数。void SendKeys(CString msg){ short vk; BOOL shift; USES_CONVERSION; wchar_t* data = T2W(msg.GetBuffer(0)); int len = wcslen(data); for(int i=0;i<len;i++) { if (data[i]>=0 && data[i]<256) //ascii字符 { vk = VkKeyScanW(data[i]); if (vk == -1) { SendUnicode(data[i]); } else { if (vk < 0) { vk = ~vk + 0x1; } shift = vk >> 8 & 0x1; if (GetKeyState(VK_CAPITAL) & 0x1) { if (data[i]>='a' && data[i]<='z' || data[i]>='A' && data[i]<='Z') { shift = !shift; } } SendAscii(vk & 0xFF, shift); } } else //unicode字符 { SendUnicode(data[i]); } }}
程序的效果:
为了展示效果,所以让线程休眠了两秒。
源码在下面:http://download.csdn.net/download/pkgk2013/9971198
整个项目使用VS 2017开发的,但是代码是通用的,如果不能打开的话,就复制cpp的代码。
- MFC 在光标所在位置输入文字(不同应用程序之间)
- Popupmenu 在光标所在位置弹出菜单
- Android EditText 在光标处插入,删除内容(例如可用于表情文字输入控件)
- 在窗体上创建自己的光标并输入文字
- 让vim的在输入模式下现实光标不同
- 在C#中获取文本框中光标所在位置
- 在C#中获取文本框中光标所在位置
- Android在EditText光标所在位置插入和删除字符串
- Android在EditText光标所在位置插入和删除字符串
- Android在EditText光标所在位置插入和删除字符串
- Android在EditText光标所在位置插入和删除字符串
- richtextbox显示光标所在位置
- C# richtextbox 光标所在位置
- 获取CComboBox光标所在位置
- 光标所在位置插入一串字符,并在特定位置设置光标锁定位置
- EditText插入表情(字符串)到光标所在位置
- UITextField(限制文字输入,调整光标,内容,占位文字显示的位置,以及基本使用)
- iphone输入文字移动光标的方法
- RTOS实时操作系统学习笔记之qnx嵌入式系统qnx系统
- 重载与重写的区别
- js随记-如何将文本框设置为不可编辑
- 【Hibernate】悲观锁和乐观锁
- 牙齿-菠菜
- MFC 在光标所在位置输入文字(不同应用程序之间)
- QNX实时操作系统学习笔记之嵌入式系统
- 1045:邮票组合问题
- PyConChina2017大会上海来啦!~
- Attention应用
- RNN网络详解
- 进程的终止类别及方式
- 一些自我提升的网址
- 剑指offer:数组中重复的数字