【问题标题】:C++ How to simulate special key strokes (alt+numepad)C++ 如何模拟特殊按键(alt+numpad)
【发布时间】: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


【解决方案1】:

如果有人需要 unicode 按键

// Press a unicode "key"
typ.ki.dwFlags = KEYEVENTF_UNICODE;
typ.ki.wVk = 0;
typ.ki.wScan = 0x2194; // HEX UNICODE 
SendInput(1, &typ, sizeof(INPUT));

// Release key
typ.ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
SendInput(1, &typ, sizeof(INPUT));

【讨论】:

    【解决方案2】:

    这行得通:

        keybd_event(0x12, MapVirtualKey(0x12, 0), 0, 0); //Alt press
        keybd_event(0x62, MapVirtualKey(0x62, 0), 0, 0); // Numpad2 press
        keybd_event(0x62, MapVirtualKey(0x62, 0), KEYEVENTF_KEYUP, 0); //Numpad2 relese
        keybd_event(0x69, MapVirtualKey(0x69, 0), 0, 0); // Numpad9 press
        keybd_event(0x69, MapVirtualKey(0x69, 0), KEYEVENTF_KEYUP, 0); //Numpad9 relese
        keybd_event(0x12, MapVirtualKey(0x12, 0), KEYEVENTF_KEYUP, 0); // Alt relese
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      相关资源
      最近更新 更多