c++ - SendInput() 无法正确管理 Alt 代码

2023-12-03

在我正在开发的程序中,我必须模拟击键,为此我使用SendInput()方法,传递一个向量作为参数,该向量包含作为击键一部分的输入。我当前的代码似乎可以与我正在测试的所有组合正常工作(Alt 代码除外)。

这就是我目前所做的:

// Press ALT
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_LMENU;
input.ki.wScan = 0;
input.ki.dwFlags = 0;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;    
keystroke.push_back(input);

// Press NumPad2
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_NUMPAD2;
input.ki.wScan = 0;
input.ki.dwFlags = 0;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;    
keystroke.push_back(input);

// Release NumPad2
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_NUMPAD2;
input.ki.wScan = 0;
input.ki.dwFlags = KEYEVENTF_KEYUP;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;    
keystroke.push_back(input);

// Press NumPad1
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_NUMPAD1;
input.ki.wScan = 0;
input.ki.dwFlags = 0;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;    
keystroke.push_back(input);

// Release NumPad1
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_NUMPAD1;
input.ki.wScan = 0;
input.ki.dwFlags = KEYEVENTF_KEYUP;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;    
keystroke.push_back(input);

// Press NumPad2
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_NUMPAD2;
input.ki.wScan = 0;
input.ki.dwFlags = 0;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;    
keystroke.push_back(input);

// Release NumPad2
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_NUMPAD2;
input.ki.wScan = 0;
input.ki.dwFlags = KEYEVENTF_KEYUP;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;    
keystroke.push_back(input);

// Release ALT
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_LMENU;
input.ki.wScan = 0;
input.ki.dwFlags = KEYEVENTF_KEYUP;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;    
keystroke.push_back(input);

SendInput(keystroke.size(), &keystroke[0], sizeof(keystroke[0]));

The push_backs 是在 a 中完成的for循环,这就是为什么我完全重新定义了input每次都有变化。

这种方法似乎适用于除 Alt 代码之外的所有组合。我怎样才能让它们也工作?谢谢。

PS:正如你所注意到的,dwFlags从不声明ALT (VK_LMENU)作为扩展密钥,因为仅根据我的理解VK_RMENU(并不是VK_LMENU) 就是这样。这个 MSDN 页面似乎证实了这一点。


使用扫描码代替虚拟按键。这会将按键注入到系统中的级别要低得多,并且比虚拟按键更可靠地模拟真实用户的输入。

我花了一段时间才找到最终的扫描代码列表,因为其中存在一些差异。但是引用中间大表中的“set 1”列这一页似乎有效。

INPUT createScanCodeEvent(WORD scancode, bool isDown)
{
    INPUT input = {};
    input.type = INPUT_KEYBOARD;
    input.ki.wVk = 0;
    input.ki.wScan = scancode;
    input.ki.dwFlags = (isDown ? 0 : KEYEVENTF_KEYUP) | KEYEVENTF_SCANCODE;
    input.ki.time = 0;
    input.ki.dwExtraInfo = 0;
    return input;
}

int inject()
{
    std::vector<INPUT> keystroke;
    const WORD SCANCODE_ALT = 0x38;
    const WORD SCANCODE_NUMPAD_1 = 0x4f;
    const WORD SCANCODE_NUMPAD_2 = 0x50;

    keystroke.push_back(createScanCodeEvent(SCANCODE_ALT, true) );

    keystroke.push_back(createScanCodeEvent(SCANCODE_NUMPAD_2, true));
    keystroke.push_back(createScanCodeEvent(SCANCODE_NUMPAD_2, false));

    keystroke.push_back(createScanCodeEvent(SCANCODE_NUMPAD_1, true));
    keystroke.push_back(createScanCodeEvent(SCANCODE_NUMPAD_1, false));

    keystroke.push_back(createScanCodeEvent(SCANCODE_NUMPAD_2, true));
    keystroke.push_back(createScanCodeEvent(SCANCODE_NUMPAD_2, false));

    keystroke.push_back(createScanCodeEvent(SCANCODE_ALT, false));

    SendInput(keystroke.size(), keystroke.data(), sizeof(keystroke[0]));

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ - SendInput() 无法正确管理 Alt 代码 的相关文章

随机推荐

  • 如何最好地根据需要生成随机数的静态数组?

    我正在开发的应用程序需要一个随机数矩阵 矩阵可以随时向任何方向增长 并且并不总是满的 我最终可能会用四叉树或其他东西重新实现它 而不是带有大量空对象的矩阵 我需要一种方法来生成相同的矩阵 给定相同的种子 无论我以什么顺序计算矩阵 LazyR
  • 为什么我的测试失败并出现 System.Security.VerificationException?

    我正在将我的一个项目从 VS2008 迁移到 VS2010 现在 当我运行测试工具时 我将解决方案中的所有项目都转换为 NET 4 0 客户端配置文件 几乎所有测试都会失败 但出现以下异常 系统 安全 验证异常 操作可能会破坏稳定 运行 我
  • SSIS XMLSource 在 XML 变量中仅看到空值

    我有一个带有引用 XML 变量的 XMLSource 的数据流任务 DataFlow 任务确实识别出变量中有 x 行 但它只在每行中看到空值 xml变量值
  • 如何向 dom 对象添加 xml 标头

    我正在使用 Python 的 xml dom minidom 但我认为这个问题对于任何 DOM 解析器都有效 我的原始文件在开头有这样一行 这似乎不是 dom 的一部分 所以当我执行 dom toxml 之类的操作时 生成的字符串在开头没有
  • iOS 获取 UIImageView 图像的可见部分

    我正在尝试获取可见部分UIImage从一个UIImageView UIImageView占据整个屏幕 添加了捏合和平移手势UIImageView 因此 用户可以平移 缩放图像视图 平移 缩放后 我只想裁剪图像视图的可见部分 我尝试了很多方法
  • 如何在运行 Gingerbread 的 root NexusOne 上安装 sqlite3

    我的根基是经营姜饼的纽带 但就像下面的帖子一样 我找不到 sqlite3 并且想在 Nexus One 上安装 sqlite3 当我尝试使用 adb shell 打开数据库时 为什么在已 root 的 Nexus One 上收到 sqlit
  • 如何在制表器中创建多选标题过滤器?

    多年来 这个问题在 Tabulator GitHub 存储库中以各种形式被多次提出 以下是一些例子 https github com olifolkerd tabulator issues 527 https github com olif
  • 如何在.Net Core应用程序中读取web.config文件

    我创建了一个 Net Core API 并引用了一个 Net 框架应用程序 引用的应用程序连接到数据库 其连接字符串存储在 web config 文件中 string CONNSTR ConfigurationManager Connect
  • 从 Facebook Ads API 获取指标

    我无法从 Facebook API 获取以下指标 我如何从 Facebook Ads API 计算出现在 Facebook 自己的广告界面中的这些指标 Reach 社会影响力 频率 CPC CPM 当您获得广告组 ID 后 您必须发出 AP
  • ffmpeg未知关键字处理输入时发现无效数据

    我有一个文件ffmpeg list of files txt与内容 file Output 0 forces vs radii pdf file Output 1 forces vs radii pdf file Output 2 forc
  • 添加不同长度的熊猫列

    我在 pandas 中添加列时遇到问题 我有DataFrame 维度是nxk 在这个过程中 我需要添加维度为 mx1 的列 其中 m 1 n 但我不知道 m 当我尝试这样做时 df Name column data type data li
  • 什么时候使用括号,什么时候不使用?

    我怎么能说 var myFunction function setTimeout myFunction 1000 myFunction 为什么函数会调用setTimeout不需要括号 但最后一行需要吗 Nutshell myFunction
  • 确定两个 360x180 等距柱状全景图像之间的相机旋转

    我有 n 帧 360x180 全景图像 我想根据两个连续图像之间的比较来确定相机的旋转 对于这个项目 可以安全地假设图像中可见的所有特征都在无穷远 我 今天 是 OpenCV 的新手 肯定需要做更多的阅读 我有一个应用程序可以使用 SIFT
  • 在 Windows 上的软件中关闭 USB 设备的电源

    我想通过 Windows 上的软件重新启动 USB 设备 我正在开发一个小型 USB 电源微控制器 该芯片将在电源循环后恢复到本机行为并允许代码下载 由于我的代码会在出现问题时使设备崩溃 使其忽略所有 USB 命令 因此我必须从系统中物理拔
  • 将带有图像的 HTML5 画布另存为图像

    我正在尝试将带有图像的画布保存为 PNG 但是当我尝试这样做时 var myCanvas document getElementById myCanvas var img document createElement img var ctx
  • 带有自定义视图的 AlertDialog:调整大小以包裹视图的内容

    我在正在构建的应用程序中遇到了这个问题 请忽略所有设计缺陷和缺乏最佳实践方法 这纯粹是为了展示我无法解决的问题的示例 I have DialogFragment它返回一个基本的AlertDialog与定制View设置使用AlertDialo
  • jquery发送post数据而不定义url

    是否可以通过ajax或post发送数据而不定义url 这是我正在尝试工作的代码 gll delete click function var gll gll val var gll string gll split var gll id gl
  • jquery 替换不起作用

    DEMO 你好 我正在尝试删除 JS 中的箭头 但似乎替换不起作用 a class pr page prev Previous a a class pr page next Next a pr page prev text replace
  • 在 Windows 10 TP 上使用 VS-2015 CTP 5 和 Python 3.5a 编译 boost-python 教程

    我正在尝试获取boost python 扩展模块教程在 Windows 10 中使用现代 C 14 编译器 我已经使用 vc 14 VS 2015 CTP 5 下载了最新版本的 boost 1 57 和 python 3 5a 源代码 我使
  • c++ - SendInput() 无法正确管理 Alt 代码

    在我正在开发的程序中 我必须模拟击键 为此我使用SendInput 方法 传递一个向量作为参数 该向量包含作为击键一部分的输入 我当前的代码似乎可以与我正在测试的所有组合正常工作 Alt 代码除外 这就是我目前所做的 Press ALT i