分解字符串并使用keybd发送字符

时间:2011-03-19 23:35:17

标签: c++ winapi

我在互联网上搜索了一个用C ++模拟按键的好系统。

我想将一个字符串发送到另一个程序,但据我所知,GenerateKey函数一次只能发送一个。我创建了代码来打破字符串并单独发送每个字母,但有时会发送字母表中特定字母的数字而不是字母本身。 (例如,我输入“h”计算机吐出“8”)

我该如何解决这个问题并且有更好的方法吗?谢谢!

#include <windows.h>
#include<iostream>
#include <winable.h>
#include <fstream>
#include<time.h>
#include<string>

using namespace std;

void GenerateKey(int vk, BOOL bExtended) {

    KEYBDINPUT  kb = {0};
    INPUT       Input = {0};

    /* Generate a "key down" */
    if (bExtended) { kb.dwFlags  = KEYEVENTF_EXTENDEDKEY; }
    kb.wVk  = vk;
    Input.type  = INPUT_KEYBOARD;
    Input.ki  = kb;
    SendInput(1, &Input, sizeof(Input));

    /* Generate a "key up" */
    ZeroMemory(&kb, sizeof(KEYBDINPUT));
    ZeroMemory(&Input, sizeof(INPUT));
    kb.dwFlags  =  KEYEVENTF_KEYUP;
    if (bExtended) { kb.dwFlags |= KEYEVENTF_EXTENDEDKEY; }
    kb.wVk = vk;
    Input.type = INPUT_KEYBOARD;
    Input.ki = kb;
    SendInput(1, &Input, sizeof(Input));

    return;
}    

int main() {

 SetConsoleTitle( "sendkeys" );
string sentence;
while (1){
  cin>>sentence;
  char letter;
  int track = 0; 

  while(sentence[track] != '\0') {

    cout<<sentence[track];
    letter = sentence[track];     
    GenerateKey(letter, FALSE);
    track++;    
}    
}    
}

2 个答案:

答案 0 :(得分:1)

这种方法非常复杂(您必须管理SHIFT,CONTROL和ALT的状态,将特殊字符转换为ALT + 0xyz组合),如果用户在此过程中更改了键盘焦点,则键可能会出错窗口。

使用SendMessage(WM_SETTEXT)SendMessage(EM_REPLACESEL),您可以将整个字符串一次性发送到特定窗口。

答案 1 :(得分:1)

我对您正在使用的某些API并不完全熟悉,但我会假设您正在尝试将文本发送到其他某个进程的stdin

如果是子进程(即您的进程自身启动),您可以使用管道和重定向的I / O,如this article中所述。