使用 SendInput 发送两个或多个字符

2023-12-12

要发送字符,我们可以使用 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。您需要声明一个包含多个的数组INPUTs, 2 INPUTs 代表每个虚拟键 - 一个用于 keydown 事件,一个用于 keyup 事件。所以,在你的例子中,你实际上需要 4INPUTs 发送 2 个虚拟密钥,如 @user4581301 的回答所示。

现在,关于KEYEVENTF_UNICODE,您不使用虚拟键,而是使用实际的 Unicode 代码点,其中它们使用 UTF-16 代码单元指定,每个代码单元一个INPUT。因此,这意味着如果您想发送需要 UTF-16 代理项对的 Unicode 代码点,则需要 2 组向下/向上INPUTs,一组用于高代理,一组用于低代理。这个警告是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(使用前将#替换为@)

使用 SendInput 发送两个或多个字符 的相关文章

随机推荐

  • 如何将图像设置为圆形

    我怎样才能将图像设置在一个圆圈中 有没有更好的方法来设置带有圆圈框的图像 特别是 Windows 10 登录屏幕上的图像框架 Circle cir2 new Circle 250 200 80 cir2 setStroke Color SE
  • 这些对象的引用是在栈上还是在堆上?

    如果有人能告诉我我是否理解得很好 我将不胜感激 class X A a1 new A reference on the stack object value on the heap a1 VarA 5 on the stack value
  • 自定义形状的边框

    在这里摆弄 我正在尝试设置一些不规则形状的边框颜色 箭头ish 我做到了 问题是 为了实现这些形状 我必须已经操纵边框 所以我不能这样做border color red 我想将每个形状的边框颜色设置为2px HTML div class m
  • 未报告的异常UnknownHostException;必须被抓住或宣布被扔出

    我有下面给出的代码 但是 当我尝试编译代码时 出现以下错误 MyClient java 12 error unreported exception UnknownHostException must be caught or declare
  • 如何在java中从图像中获取光栅?

    我正在尝试将 gif 图像从 url 加载到 java util image Raster 中 以便我可以操作它 我能找到的加载和解压缩图像的唯一方法是 Toolkit getImage 它返回 java awt Image 我需要将其转换
  • 如何在您的网站中使用长轮询或 Ajax 推送

    我想知道如何使用ajax推送 我从各种网络文章中了解到 Ajax推送可以通过使用一些程序来获得 例如COMET APE AJAX PUSH ENGINE 等 但我想知道是否有更简单的使用方法以及使用什么语言实现ajax推送 因为在我看过的文
  • Ruby on Rails 中多对多的正确实现?

    新手提问 请注意 我想在 Rails 中实现基本的多对多关系 并且我试图找出哪种方法被认为是其中最 Rails 方式 在传统的非 ActiveRecord 数据库中 我刚刚创建了两个表和一个联结表 并编写了一堆逻辑 以确保在对其中任何一个表
  • PHP:根据季节设置图像?

    大家好 你对此有何看法 我想根据是冬季还是夏季在我的网站上设置一个标题图像 一个用于冬季 一个用于夏季 所以我想知道最简单的方法是什么 我想到使用 date n 并查询返回的值对于冬季或夏季月份是否为真 你会怎么办 谢谢你的提示 谷歌搜索并
  • 片段之间的通信

    我有默认的主从流程 该流程是在创建新项目时自动创建的 我的问题是 当我向详细信息侧添加按钮时 有没有办法通过按该按钮来更新我的列表面 换句话说 ItemDetailFragment 和 ItemListFragment 可以通信吗 是的 只
  • Android 中的加权热图

    我正在尝试为我的 Android 应用程序项目创建一个加权热图 我查看了谷歌文档 我不明白如何使用颜色数组和起点数组创建新的渐变 起始数组表示为 每种颜色的起点 以最大强度的百分比形式给出 这是什么意思 如何将颜色数组与起点数组关联起来 i
  • 如何在 ionic 4 中隐藏滚动条上的标题?

    我想知道如何通过向下滚动页面来隐藏 Ionic 4 中的标题 并在向上滚动时重新显示它 我找到了许多关于如何做到这一点的解决方案 但结果都证明它们不起作用或已经过时了 因此 我收集了我能找到的所有信息来提供这个答案 谢谢这个视频我让它工作了
  • 以html形式输入Integer时抛出BadValueError

    我正在使用 Python 创建 Google App Engine 应用程序 为了测试我的应用程序 我使用 html 表单输入数据 在我的表格中我有一行 tr td Age td td td tr
  • PHPStorm 8 + PHPUnit 4.2.6 错误

    我做不到PHPUnit 4 2 6跟 共事PHPStorm 8 PHPUnit 在 PHPStorm 8 设置中作为 phar 加载 每当我尝试在 PHPStorm 中运行单元测试时 我都会收到此错误 Parse error syntax
  • 将输出重定向到文本文件c#

    这是我的代码 Process pr2 new Process pr2 StartInfo FileName show snps pr2 StartInfo Arguments Clr x 2 out delta gt out snps pr
  • 转换后的 PDF 中缺少文档中替换的文本

    我从 Google Apps 脚本开始并尝试创建文件 Google Doc 的副本 然后替换复制文档中的文本并将其转换为 PDF 该功能工作正常 但替换的文本不会出现在 PDF 文件中 而是出现在复制的文件 我替换的位置 中 我读到了关于s
  • 角度数据表列可拖出表格

    是否可以避免该列 而不是拖出数据表视图区域 正如您可以自己看出的那样 我从此链接中谈论的内容https l lin github io angular datatables withColReorder when you try to dr
  • 是否存在禁用 file_get_contents() 函数工作的机制?

    i use file get contents 函数从站点获取数据并将数据存储在数据库中 如果有一天脚本开始不起作用 这对我来说将非常不方便 我知道 如果他们改变网站的结构 它可能会开始不起作用 但现在我担心 也许有机制可以禁用此功能的工作
  • Android 模拟器无法访问互联网

    我无法在模拟器中访问互联网 它甚至无法在模拟器浏览器上连接到谷歌 我已经检查过设置 数据已启用复选框已选中 在发布问题之前我提到了一些SO问题 As 这个答案建议 我没有启用 wifi 所以这似乎不是问题 作为另一个答案在同一个问题中 我尝
  • IBM Worklight - 连接/重新连接:WL.Client.connect 与 connectOnStartup 与 WL.Client.invokeProcedure

    在我们的项目中 我们试图弄清楚连接到服务器的最佳流程是什么 特别是在处理离线 在线场景等时 现在 对于我们来说 连接到 WL 服务器的所有三个选项似乎都是相似的 无论我们使用什么选项 我们都可以完美地调用我们的适配器过程 并且我们会收到在控
  • 使用 SendInput 发送两个或多个字符

    要发送字符 我们可以使用 SendInput 我如何使用它来发送多个字符 我尝试了这段代码 但它没有发送任何内容 INPUT in in type INPUT KEYBOARD in ki wScan 0 in ki time 0 in k