我在互联网上搜索了一个用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++;
}
}
}
答案 0 :(得分:1)
这种方法非常复杂(您必须管理SHIFT,CONTROL和ALT的状态,将特殊字符转换为ALT + 0xyz组合),如果用户在此过程中更改了键盘焦点,则键可能会出错窗口。
使用SendMessage(WM_SETTEXT)
或SendMessage(EM_REPLACESEL)
,您可以将整个字符串一次性发送到特定窗口。
答案 1 :(得分:1)
我对您正在使用的某些API并不完全熟悉,但我会假设您正在尝试将文本发送到其他某个进程的stdin
?
如果是子进程(即您的进程自身启动),您可以使用管道和重定向的I / O,如this article中所述。