• 在VC中使用SendInput函数实现中文的自动输入


    转载自:http://xylvhp.blog.163.com/blog/static/31123614201101104644542/

     

     

    首先是,头文件必须包含以下两个:
    #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:   \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) );

  • 相关阅读:
    webpack 报错(Cannot find moudle ‘webpack-cliinconfig-yargs‘)
    js图片压缩推荐
    Object.assign()更新对象
    poj 2063完全背包
    poj 3592 缩点+SPFA
    hdu2546 01背包 重学背包
    hdu 2503 1713 1108 最小公倍数&最大公约数
    poj3249 拓扑排序+DP
    poj2914无向图的最小割模板
    poj2942(双联通分量,交叉染色判二分图)
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/3130446.html
Copyright © 2020-2023  润新知