首先是,头文件必须包含以下两个:
#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函数实现中文的自动输入相关推荐

  1. 关于VC中的时间函数讨论

    关于在VC中时间函数的事业问题在论坛有不少的帖子讨论,下面结合讨论结果和相关的知识做个总结. 先从一个如何在程序中延时的问题谈起,延时的方法有 方法一: 使用sleep函数,它的最小单位是1ms,如延 ...

  2. VC++中的WinMain()函数介绍

    WinMain()函数 WinMain()函数等价于控制台程序中的main()函数.该函数是执行开始的地方,也是为程序其余 部分执行基本初始化工作的地方.为了允许 Windows 传递数据,WinMa ...

  3. VC中常见API函数使用方法(经验版)

    ***********************************************声明*************************************************** ...

  4. VC中常见API函数用法(经验版)

    ***********************************************声明*************************************************** ...

  5. VC中的RegisterHotKey函数与HotKey控件(CHotKeyCtrl)

    1.其实,关于RegisterHotKey函数本人写过一个简单的示例,主要是利用这个函数实现全局热键. 具体的链接:http://blog.csdn.net/wwkaven/article/detai ...

  6. VC++中定时器SetTimer函数的应用总结

    什么时候我们需要用到SetTimer函数呢?当你 需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了.使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以 ...

  7. python中通过什么函数来获取键盘的输入_Python中使用 input 函数来获取输入

    所谓输入,就是用代码获取用户通过键盘输入的信息. 例如:去银行取钱,在 ATM 上输入密码. 在 Python 中,如果要获取用户在键盘上的输入信息,需要使用到input()函数. 函数input() ...

  8. 在VC中使用MATLAB C++函数库

    http://Tech.16C.Cn 在VC中使用MATLAB C/C++函数库 MATLAB广泛应用于线性代数.自动控制理论.数理统计.数字信号处理.时间序列分析.动态系统仿真等领域.因此如果在VC ...

  9. VC中基于 Windows 的精确定时

    方式一:VC中的WM_TIMER消息映射能进行简单的时间控制.首先调用函数SetTimer()设置定时 间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔.然后在应用程序中增 ...

  10. java sendmessage函数_vc中SendMessage自定义消息函数用法实例

    本文实例讲述了vc中SendMessage自定义消息函数用法,分享给大家供大家参考.具体如下: SendMessage的基本结构如下: SendMessage( HWND hWnd,  //消息传递的 ...

最新文章

  1. 2018湖北计算机准考证打印,2018年3月湖北计算机等级考试准考证打印入口
  2. 更灵活的定位内存地址的方法---汇编学习笔记
  3. java 有什么方法可以动态或循环的生成对象名
  4. Linux 中 VIM 的使用
  5. mysql round 0.1111_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)...
  6. rtklib 天线相位中心_发射天线的作用
  7. Java面试之到底值传递和引用传递???
  8. html 背景区域设置,HTML5 背景的显示区域实现
  9. 系统学习机器学习之线性判别式(一)
  10. java sql插入_java 中如何使用sql插入语句?
  11. [译] 用行为经济学来传达付费应用订阅的价值
  12. H5调起手机端的摄像头
  13. java软件工程师工作业绩_java软件工程师的工作描述怎么写
  14. 深入学习Spring IOC和AOP 实例代码
  15. 【算法】牛和牛栏如何匹配到最大值
  16. 打造智慧城市 构建新型城镇化
  17. docker安装solr搜索引擎
  18. uni.navigateTo页面跳转时传对象参数
  19. 灯的开关状态 :有 N 个灯放在一排,从 1 到 N 依次顺序编号。有 N 个人也从 1 到 N 依次编号。1 号将灯 全部关闭,2 将凡是 2 的倍数的灯 打开;3 号将凡是 3 的倍数的灯作相
  20. audio_policy.conf文件:AUDIO_DEVICE_IN_REMOTE_SUBMIX含义

热门文章

  1. 解决办法:ImportError: 'module' object has no attribute 'check_specifier'
  2. 遇到Python中文目录名问题,未解决
  3. TensorFlow+pytorch+gpu+anaconda极简安装教程
  4. C++ WinExec system 隐藏黑框;清空文件
  5. linux5分钟打印一次的脚本,centos7中crontab定时计划任务5分钟一次命令写法
  6. angularjs动态侧边栏菜单_极速PDF的工具菜单栏不见了如何恢复?
  7. python函数传递列表_python传递列表作为函数参数
  8. python能做后端吗_【后端开发】python能做回归么
  9. python双循环_双for循环到Python列表理解
  10. python中的scatter函数_Python Matplotlib scatter函数:绘制散点图