在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]);
}
}
}
直接调用SendKeys函数就可以在当前光标的位置自动输入指定的字符串,下面的例子演示了如何自动打开记事本程序并输入一段话:
void CSendInputDlg::OnTest()
{
ShellExecute(NULL, NULL, "notepad.exe", NULL, NULL, SW_SHOWNORMAL);
Sleep(500); //为了确保记事本程序打开完毕,稍等片刻
CWnd *pWnd = FindWindow(NULL, "无标题 - 记事本");
if (pWnd)
{
pWnd->SetForegroundWindow();
SendKeys("我是sway,我爱中国!\nI love China!\nEmail: xmujava@163.com\t\n2010-05-21 \b\b");
}
}
//
SendInput模拟键盘和鼠标事件
INPUT kbinput[5];
ZeroMemory( &kbinput, sizeof(INPUT)*5 );
kbinput[0].type = INPUT_KEYBOARD;
kbinput[0].ki.wVk = 'Z';
kbinput[1].type = INPUT_KEYBOARD;
kbinput[1].ki.wVk = 'W';
kbinput[2].type = INPUT_KEYBOARD;
kbinput[2].ki.wVk = 'J';
//kbinput[2].ki.dwFlags = KEYEVENTF_KEYUP;
kbinput[3].type=INPUT_MOUSE;
kbinput[3].mi.dx=100;
kbinput[3].mi.dy=100;
kbinput[3].mi.mouseData=0;
kbinput[3].mi.dwFlags=MOUSEEVENTF_RIGHTDOWN;
kbinput[4].type=INPUT_MOUSE;
kbinput[4].mi.dx=100;
kbinput[4].mi.dy=100;
kbinput[4].mi.mouseData=0;
kbinput[4].mi.dwFlags=MOUSEEVENTF_RIGHTUP;
UINT uRet = SendInput( 5, kbinput, sizeof(INPUT) );
转载于:https://www.cnblogs.com/iTaoqi/archive/2012/05/19/2508488.html
在VC中使用SendInput函数实现中文的自动输入相关推荐
- 关于VC中的时间函数讨论
关于在VC中时间函数的事业问题在论坛有不少的帖子讨论,下面结合讨论结果和相关的知识做个总结. 先从一个如何在程序中延时的问题谈起,延时的方法有 方法一: 使用sleep函数,它的最小单位是1ms,如延 ...
- VC++中的WinMain()函数介绍
WinMain()函数 WinMain()函数等价于控制台程序中的main()函数.该函数是执行开始的地方,也是为程序其余 部分执行基本初始化工作的地方.为了允许 Windows 传递数据,WinMa ...
- VC中常见API函数使用方法(经验版)
***********************************************声明*************************************************** ...
- VC中常见API函数用法(经验版)
***********************************************声明*************************************************** ...
- VC中的RegisterHotKey函数与HotKey控件(CHotKeyCtrl)
1.其实,关于RegisterHotKey函数本人写过一个简单的示例,主要是利用这个函数实现全局热键. 具体的链接:http://blog.csdn.net/wwkaven/article/detai ...
- VC++中定时器SetTimer函数的应用总结
什么时候我们需要用到SetTimer函数呢?当你 需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了.使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以 ...
- python中通过什么函数来获取键盘的输入_Python中使用 input 函数来获取输入
所谓输入,就是用代码获取用户通过键盘输入的信息. 例如:去银行取钱,在 ATM 上输入密码. 在 Python 中,如果要获取用户在键盘上的输入信息,需要使用到input()函数. 函数input() ...
- 在VC中使用MATLAB C++函数库
http://Tech.16C.Cn 在VC中使用MATLAB C/C++函数库 MATLAB广泛应用于线性代数.自动控制理论.数理统计.数字信号处理.时间序列分析.动态系统仿真等领域.因此如果在VC ...
- VC中基于 Windows 的精确定时
方式一:VC中的WM_TIMER消息映射能进行简单的时间控制.首先调用函数SetTimer()设置定时 间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔.然后在应用程序中增 ...
- java sendmessage函数_vc中SendMessage自定义消息函数用法实例
本文实例讲述了vc中SendMessage自定义消息函数用法,分享给大家供大家参考.具体如下: SendMessage的基本结构如下: SendMessage( HWND hWnd, //消息传递的 ...
最新文章
- 2018湖北计算机准考证打印,2018年3月湖北计算机等级考试准考证打印入口
- 更灵活的定位内存地址的方法---汇编学习笔记
- java 有什么方法可以动态或循环的生成对象名
- Linux 中 VIM 的使用
- mysql round 0.1111_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)...
- rtklib 天线相位中心_发射天线的作用
- Java面试之到底值传递和引用传递???
- html 背景区域设置,HTML5 背景的显示区域实现
- 系统学习机器学习之线性判别式(一)
- java sql插入_java 中如何使用sql插入语句?
- [译] 用行为经济学来传达付费应用订阅的价值
- H5调起手机端的摄像头
- java软件工程师工作业绩_java软件工程师的工作描述怎么写
- 深入学习Spring IOC和AOP 实例代码
- 【算法】牛和牛栏如何匹配到最大值
- 打造智慧城市 构建新型城镇化
- docker安装solr搜索引擎
- uni.navigateTo页面跳转时传对象参数
- 灯的开关状态 :有 N 个灯放在一排,从 1 到 N 依次顺序编号。有 N 个人也从 	1 到 N 依次编号。1 号将灯 全部关闭,2 将凡是 2 的倍数的灯 	打开;3 号将凡是 3 的倍数的灯作相
- audio_policy.conf文件:AUDIO_DEVICE_IN_REMOTE_SUBMIX含义
热门文章
- 解决办法:ImportError: 'module' object has no attribute 'check_specifier'
- 遇到Python中文目录名问题,未解决
- TensorFlow+pytorch+gpu+anaconda极简安装教程
- C++ WinExec system 隐藏黑框;清空文件
- linux5分钟打印一次的脚本,centos7中crontab定时计划任务5分钟一次命令写法
- angularjs动态侧边栏菜单_极速PDF的工具菜单栏不见了如何恢复?
- python函数传递列表_python传递列表作为函数参数
- python能做后端吗_【后端开发】python能做回归么
- python双循环_双for循环到Python列表理解
- python中的scatter函数_Python Matplotlib scatter函数:绘制散点图