给出以下代码
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(使用前将#替换为@)