要发送字符,我们可以使用 SendInput。我如何使用它来发送多个字符?
我尝试了这段代码,但它没有发送任何内容:
INPUT in;
in.type=INPUT_KEYBOARD;
in.ki.wScan=0;
in.ki.time=0;
in.ki.dwExtraInfo=0;
in.ki.wVk=0x53+0x54;
SendInput(2,&in,sizeof(INPUT));
那么,什么是正确的方法呢?
第一个参数为SendInput()
指定有多少个INPUT
你正在传递的结构。你只传递了 1,但你正在告诉SendInput()
你正在传递 2。
您不能在单个虚拟键中指定两个单独的虚拟键INPUT
。您需要声明一个包含多个的数组INPUT
s, 2 INPUT
s 代表每个虚拟键 - 一个用于 keydown 事件,一个用于 keyup 事件。所以,在你的例子中,你实际上需要 4INPUT
s 发送 2 个虚拟密钥,如 @user4581301 的回答所示。
现在,关于KEYEVENTF_UNICODE
,您不使用虚拟键,而是使用实际的 Unicode 代码点,其中它们使用 UTF-16 代码单元指定,每个代码单元一个INPUT
。因此,这意味着如果您想发送需要 UTF-16 代理项对的 Unicode 代码点,则需要 2 组向下/向上INPUT
s,一组用于高代理,一组用于低代理。这个警告是NOT中提到的SendInput()
文档,但事实暗示vScan
字段是16位WORD
, 然后KEYEVENTF_UNICODE
事件产生WM_CHAR
消息,它将 UTF-16 代理代码单元作为单独的消息传递。
因此,要发送一串 Unicode 字符,请使用KEYEVENTF_UNICODE
,你可以这样做:
#include <vector>
#include <string>
void SendInputString(const std::wstring &str)
{
int len = str.length();
if (len == 0) return;
std::vector<INPUT> in(len*2);
ZeroMemory(&in[0], in.size()*sizeof(INPUT));
int i = 0, idx = 0;
while (i < len)
{
WORD ch = (WORD) str[i++];
if ((ch < 0xD800) || (ch > 0xDFFF))
{
in[idx].type = INPUT_KEYBOARD;
in[idx].ki.wScan = ch;
in[idx].ki.dwFlags = KEYEVENTF_UNICODE;
++idx;
in[idx] = in[idx-1];
in[idx].ki.dwFlags |= KEYEVENTF_KEYUP;
++idx;
}
else
{
in[idx].type = INPUT_KEYBOARD;
in[idx].ki.wScan = ch;
in[idx].ki.dwFlags = KEYEVENTF_UNICODE;
++idx;
in[idx].type = INPUT_KEYBOARD;
in[idx].ki.wScan = (WORD) str[i++];
in[idx].ki.dwFlags = KEYEVENTF_UNICODE;
++idx;
in[idx] = in[idx-2];
in[idx].ki.dwFlags |= KEYEVENTF_KEYUP;
++idx;
in[idx] = in[idx-2];
in[idx].ki.dwFlags |= KEYEVENTF_KEYUP;
++idx;
}
}
SendInput(in.size(), &in[0], sizeof(INPUT));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)