【发布时间】:2020-01-23 01:01:22
【问题描述】:
我正在开展一个项目,我必须将某些文本发送到特定网页(在 Chrome 中),但我无法直接发送或复制和粘贴它。我想出的解决方案是键盘机器人——我使用虚拟键来完成这项工作,但在该文本中我有特殊符号“↔”(Alt+numepad2+numepad9),我无法使用虚拟键。对于任何可行的解决方案,我将不胜感激。我确实尝试了我发现的各种方法,但没有任何效果,如果我只模拟 alt 按下并在数字键盘上手动输入它可以工作,但程序不会这样做。 这是我的代码:
#define WINVER 0x0500
#include <windows.h>
int main()
{
INPUT typ;
typ.type = INPUT_KEYBOARD;
typ.ki.wScan = 0;
typ.ki.time = 0;
typ.ki.dwExtraInfo = 0;
//Time to select window
Sleep(5000);
// Press the "X" key
typ.ki.wVk = 'X';
typ.ki.dwFlags = 0; // 0 for key press
SendInput(1, &typ, sizeof(INPUT));
// Release the "X" key
typ.ki.wVk = 'X';
typ.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &typ, sizeof(INPUT));
// Press the "Alt" key
typ.ki.wVk = VK_MENU;
typ.ki.dwFlags = KEYEVENTF_EXTENDEDKEY|0;
SendInput(1, &typ, sizeof(INPUT));
//Sleep(3000);
// Press the "2" key
typ.ki.wVk = VK_NUMPAD2;
typ.ki.dwFlags = KEYEVENTF_EXTENDEDKEY|0;
SendInput(1, &typ, sizeof(INPUT));
// Release the "2" key
typ.ki.wVk = VK_NUMPAD2;
typ.ki.dwFlags = KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP;
SendInput(1, &typ, sizeof(INPUT));
// Release the "Alt" key
typ.ki.wVk = VK_MENU;
typ.ki.dwFlags = KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP;
SendInput(1, &typ, sizeof(INPUT));
return 0;
}
【问题讨论】:
-
SendInput()支持键盘事件的KEYEVENTF_UNICODE标志,因此您可以发送 Unicode 代码点而不是虚拟键代码。对于文本字符,您应该使用KEYEVENTF_UNICODE并在硬件事件中省略它 -
虽然 unicode 代码在记事本中工作,但我发送消息的网页回答我时出现错误“文本组值的长度无效。长度为 29。允许 1 到 20 之间”
-
如果没有看到将击键发送到网页的更新代码,我无法对此发表评论。另外,您为什么要求助于
SendInput()而不是使用 UI 自动化或浏览器自己的 DOM API? -
代码的更新部分在下面的答案中。我只是用我目前的知识做了我能做的,所以如果你能推荐我一个很好的教程,里面有这些例子,我会很感激的。程序的整个目的是捕获从机器(SYSMAC)发送的字符串,该机器扫描条形码并将其添加到网页中的数据库中,并且......由于它,我的输入选项有限。在机器之前,一切都是手动完成的,网页所有者拒绝更改它的代码
-
您不必使用网页插入数据库。检查 Web 服务器是否为此提供基于 REST 的 API。如果没有,您始终可以使用 HTTP 客户端库与 Web 服务器进行交互,类似于 Web 浏览器在幕后的操作。这两种方法都可以让您更好地控制以代码形式向 Web 服务器提交 Unicode 数据,而无需借助 UI 操作
标签: c++ windows input keyboard virtual-keyboard