将单元素数组传递给 SendInput 是一个错误吗?

2023-12-07

给出以下代码

void foo() {
    INPUT input{};
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    SendInput(1, &input, sizeof(input));
    input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
    SendInput(1, &input, sizeof(input));
};

将单元素数组传递给是一个错误吗发送输入在连续通话中?文档似乎完全支持这一点。


简短的回答:也许吧。

更长的答案:这取决于。

看看它取决于什么,当这很重要时,有助于理解为什么发送输入被引入到 Windows API 中:一方面,它巩固了按键事件 and 鼠标事件API 集成到单个 API 调用中。更重要的是,它添加了以前的调用所不具备的重要功能。文档中对此进行了调用:

The 发送输入函数将事件插入INPUT结构串行到键盘或鼠标输入流中。这些事件不会与其他键盘或鼠标输入事件穿插由用户(使用键盘或鼠标)或通过调用插入按键事件, 鼠标事件,或其他调用发送输入.

换句话说:SendInput建立注入输入序列的原子性,而不管调用代码控制之外的外部事件。

当输入由一系列单独事件组成时(如问题中所示),原子注入输入通常很重要。该代码在 2 个单独的调用中注入了一个鼠标按钮按下,然后是一个鼠标按钮向上SendInput。虽然目的是拥有单个鼠标单击事件,但该实现允许其他输入源散布输入。当另一个输入源在鼠标按钮按下和向上事件之间产生鼠标移动事件时,预期的单击已变成拖放操作。相同的代码不是在文件资源管理器中选择文件,而是将文件扔到回收站中。这显然构成了一个错误。

Likewise, injecting keyboard input consisting of key combinations generally requires atomicity guarantees. Injecting Ctrl+C requires all four input events to be in a single transaction. Otherwise, a (malicious) input source could synthesize a Ctrl key up event right after the Ctrl key down, leaving the code injecting a C, with a stray Ctrl key up event trailing. That's probably not what was intended either.

总结:这是一个调用错误SendInput反复、路过1如果满足以下条件,则作为第一个参数:

  • 输入由一系列单独的输入事件组成。
  • 输入需要被解释为单个单元。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将单元素数组传递给 SendInput 是一个错误吗? 的相关文章

随机推荐

  • 想知道为什么 scipy.spatial.distance.sqeuclidean 比 numpy.sum((y1-y2)**2) 慢两倍

    这是我的代码 import numpy as np import time from scipy spatial import distance y1 np array 0 0 0 0 1 0 0 0 0 0 y2 np array 0 0
  • NSIS - 如何递归地仅包含源文件夹和子文件夹中的所有文件?

    每个人 我试图将一些 parentdir 与文件包含到我的安装程序中 问题是 我使用 r 参数来包含所有文件和文件夹 如下所示 File r parentdir 此命令包括所有文件和子文件夹 是否有机会仅将所有子文件夹 下面的示例 中的文件
  • 为什么“git rebase -p”不保留冲突解决方案?

    Has the man page陈述关于git rebase preserve 合并冲突解决方案或对合并提交的手动修改不会保留 这有什么好的理由吗 这与存在的理由是一样的command git rerere Reuse recorded r
  • 为什么 JavaScript 中数组允许字符串作为索引? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我们已经知道 数组和对象之间的区别之一是 如果你想提供特定的键 唯一的选择是一个对象 如果你不关心键 它就是一个数组 阅读更多here 此外 根据MDN 的文档 Arrays 不
  • 附加到画布内对象的事件

    我只有在画布上绘制矩形的画布代码 var x document getElementById canvas var ctx x getContext 2d ctx rect 20 20 150 100 ctx stroke 是否可以在所述矩
  • 如何通过分页从我的mysql数据库表中每页仅显示5条记录?

    我要显示通过分页每页五个记录 mysql php html css 直到显示所有记录 导航到页面必须是这样的 页码 1 2 3 4 5 6 7 7 8 最后 这是我的代码 用于查看 emp master 表中的所有记录 我是 PHP 新手
  • 使用ajax调用php函数

    我试图在单击 HTML 按钮时调用 php 函数 我做了一些搜索 发现直接执行此操作是不可能的 我应该使用 ajax 所以这是我到目前为止的尝试 但不起作用 这是我的 test php 该函数也在这个页面中
  • 如何在 Spring MVC 控制器中处理不同的日期格式?

    是否可以在 Spring MVC 控制器中处理不同的日期格式 我知道设置这样的东西 InitBinder protected void initBinder WebDataBinder binder SimpleDateFormat dat
  • Python 文件重命名

    我的目录中有一些文件 文件 IL txt文件 IL csv文件 NY txt文件 NY csv 我将不得不重命名它们 以便它们获得序列号 例如 文件 IL txt 001文件 IL csv 001文件 NY txt 002file NY c
  • SharePoint 中的 VBA MKDIR 失败

    这是我的问题 我正在尝试在 SharePoint 共享文档库中创建一个文件夹 但它仅在我使用 使用 Windows 资源管理器打开 菜单项输入凭据后才有效 如果我告诉我的用户他们需要先这样做 他们将不会理解 所以 我的问题是 A 有没有办法
  • 安装人员绑定

    我有一些安装程序 例如 JDK 阿帕奇雄猫 MySQL MySQL GUI 等 我想将所有这些安装程序捆绑在一起成一个 exe文件 以便单个 exe 将一一遍历所有安装程序 结果将 希望 使用户尽可能轻松地安装许多软件包 MySQL 安装程
  • WebView 上的 NullPointerException (WebView.requestFocus())

    我有一个问题 在我的 Android 应用程序中 有一个 Activity 包含WebView This WebView包含播放的 Flash 内容 当我从该应用程序切换到主屏幕时 Flash 内容在后台流畅运行 当我切换到主屏幕然后关闭屏
  • file_exists 不适用于本地主机 URL

    我有这段 PHP 代码 if file exists POST current folder do something But file exists总是返回 false 传递给该函数的值是 echo POST current folder
  • 数据框中列表的 Pandas 平均值

    我有一个 pandas DataFrame 其中包含包含列表的列 我正在尝试获取本专栏中列表的含义 这是我的 DataFrame 的示例 Loc Background 0 115227854 0 000120481927711 1 1152
  • mysql C++ 中的连接崩溃

    目前 我已经实现了一个写入 mysql 数据库的程序 我也使用 Xcode 和 c 我已正确导入所有库 但在这一行收到 BAD EXCESS 错误消息 con driver gt connect tcp 127 0 0 1 3306 roo
  • 用Java解析JSON数据

    我想解析此页面中的一些数据 http www bbc co uk radio1 programmes schedules england 2013 03 1 json 我想要解析的数据是标题 但我不确定如何提取数据 这是我到目前为止所做的
  • Apache Spark 中的数据集

    Dataset
  • 如何隐藏 Firefox 窗口(Selenium WebDriver)?

    当我同时执行多个测试时 我不想让 Firefox 浏览器窗口保持可见 我可以使用以下命令将其最小化selenium minimizeWindow 但我不想这样做 有什么办法可以隐藏 Firefox 窗口吗 我正在使用 FireFox Web
  • 删除日期字符串中的前导零

    我有一个如下所示的日期字符串 2011 02 03 我想删除字符串的日期和月份部分中的前导零 我该怎么做呢 2011 02 03 replace 0 g gt 2011 2 3 Update 根据 Lucky的问题 您可以考虑其他可能有前导
  • 将单元素数组传递给 SendInput 是一个错误吗?

    给出以下代码 void foo INPUT input input type INPUT MOUSE input mi dwFlags MOUSEEVENTF LEFTDOWN SendInput 1 input sizeof input