要发送char,我们可以使用SendInput。如何使用它发送多个char?
我尝试了这段代码,但它没有发送任何内容:
function whatever (){
var a = 0,
amodded = mod(a);
}
function mod(obj){
return ++obj;
}
那么,正确的方法是什么?
答案 0 :(得分:4)
SendInput()
的第一个参数指定您传入的INPUT
个结构的数量。您只传入1,但是您告诉SendInput()
您传递了2. < / p>
您无法在单个INPUT
中指定两个单独的虚拟键。您需要声明一个多个INPUT
的数组,每个虚拟键一个,并且不要忘记为每个虚拟键包含2个INPUT
- 一个用于keydown事件,一个用于keyup事件。因此,在您的示例中,您实际上需要4个INPUT
来发送2个虚拟密钥,如@ user4581301的答案所示。
现在,关于KEYEVENTF_UNICODE
,您不使用虚拟密钥,而是使用实际的Unicode代码点,使用UTF-16代码单元指定它们,每INPUT
一个。这意味着如果你想发送一个需要UTF-16代理对的Unicode代码点,你需要2 INPUT
s,一个用于高代理,一个用于低代理。警告是SendInput()
文档中提到的 NOT ,但vScan
字段是16位WORD
,而{{1}事件生成KEYEVENTF_UNICODE
消息,它将UTF-16代理代码单元作为单独的消息传递。
因此,要使用WM_CHAR
发送一串Unicode字符,您可以执行以下操作:
KEYEVENTF_UNICODE
答案 1 :(得分:3)
如果我说得对,你想要更多的东西:
INPUT in[4] = {0}; // four inputs
// first input 0x53
in[0].type=INPUT_KEYBOARD;
in[0].ki.wScan=0;
in[0].ki.dwFlags=0;
in[0].ki.time=0;
in[0].ki.dwExtraInfo=0;
in[0].ki.wVk=0x53;
in[1] = in[0];
in[1].ki.dwFlags |= KEYEVENTF_KEYUP;
// second input 0x54
in[2].type=INPUT_KEYBOARD;
in[2].ki.wScan=0;
in[2].ki.dwFlags=0;
in[2].ki.time=0;
in[2].ki.dwExtraInfo=0;
in[2].ki.wVk=0x54;
in[3] = in[2];
in[3].ki.dwFlags |= KEYEVENTF_KEYUP;
SendInput(4,in,sizeof(INPUT));
可能希望将设置INPUT结构的grunt工作包装成函数以减少重复。
答案 2 :(得分:1)
其他答案似乎在 DirectX 游戏中不起作用。我在 TrackMania Nations 中测试了以下内容并且它工作正常:(记事本等也能正常工作)
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <string>
void press_some_keys (std::string str) {
INPUT input[2 * (int)str.size()] = {0};
int cnt = 0;
for (char ch: str) {
input[cnt].type = INPUT_KEYBOARD;
input[cnt].ki.dwFlags = KEYEVENTF_SCANCODE;
input[cnt].ki.wScan = MapVirtualKey(LOBYTE(VkKeyScan(ch)), 0);
cnt++;
input[cnt] = input[cnt - 1];
cnt++;
}
SendInput(2 * (int)str.size(), input, sizeof(INPUT));
Sleep(10);
for (cnt = 1; cnt < 2 * (int)str.size(); cnt += 2)
input[cnt].ki.dwFlags |= KEYEVENTF_KEYUP;
SendInput(2 * (int)str.size(), input, sizeof(INPUT));
}
我只测试了小写字母字符(没有箭头或其他),但对我来说已经足够了。
让它工作起来很痛苦,因为我发现最接近的是 Youtube 视频中的单击功能:-)