Разбиение строки и использование keybd для отправки символов - PullRequest
1 голос
/ 20 марта 2011

Я искал в интернете хорошую систему для эмуляции нажатий клавиш в 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 ]

1 голос
/ 20 марта 2011

Я не совсем знаком с некоторыми API, которые вы используете, но я собираюсь предположить, что вы пытаетесь отправить текст на stdin какого-то другого процесса?

Еслиэто дочерний процесс (т. е. тот, который ваш процесс запустил сам), вы можете использовать каналы и перенаправленный ввод / вывод, как описано в этой статье .

1 голос
/ 20 марта 2011

Такой подход действительно сложен (вам нужно управлять состоянием SHIFT, CONTROL и ALT, конвертировать специальные символы в комбинации ALT + 0xyz), и если пользователь меняет фокус клавиатуры в процессе, клавиши могут перейти не туда. окно. * * 1001

Используя SendMessage(WM_SETTEXT) или SendMessage(EM_REPLACESEL), вы можете отправить целую строку сразу в конкретное окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...