如何使用 Send Message() 而不是 SendInput() 来模拟硬件按键按下?

2024-01-31

我一直在尝试对阻止 Windows GDI API(可能通过 API 挂钩)的游戏进行屏幕捕获,因此我无法使用旧的BitBlt()不幸的是,用于捕获屏幕。每当我打电话BitBlt,它失败并显示错误代码:126(ERROR_MOD_NOT_FOUND),这很奇怪!

我尝试使用首选 API 模拟键盘上的打印屏幕键SendInput()发送VK_SNAPSHOTWindows 的关键事件,以及它可以成功地将屏幕捕获到剪贴板, 但仅当游戏未运行时.

INPUT inputs[2];
memset(inputs, 0x00, sizeof(INPUT) * 2);
// Key Press
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_SNAPSHOT;
inputs[0].ki.dwFlags = KEYEVENTF_EXTENDEDKEY;

// Key release
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = VK_SNAPSHOT;
inputs[1].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP;
SendInput(2, inputs, sizeof(INPUT));

我理解这种行为的原因可能是因为游戏(闭源软件)通过安装了低级键盘挂钩SetWindowHookEx()并且正在捕获VK_SNAPSHOT并能够通过检查来区分注入的击键flags for LLKHF_INJECTED,并捕获这样的注入VK_SNAPSHOT通过使其跳过链来获取密钥,并且它不会传递到 Windows。

But, the game application generously allows the hardware presses to be interpreted by Windows, and I can take a screenshot by pressing the hardware PrntSc (print screen) key on the physical keyboard!

现在,我假设 Windows 中有一个窗口(可能是桌面窗口?)可以直接接受打印屏幕击键,无论是虚拟的还是硬件的。我可能是错的,请纠正我。

所以,我正在考虑使用Windows APISendMessage()发送VK_SNAPSHOT事件到桌面窗口,但不幸的是它不起作用,无论是在游戏运行时,还是在正常情况下VK_SNAPSHOT由...发送SendInput()工作正常。

这就是我使用的方式SendMessage():

/* Key Press */
SendMessage(GetDesktopWindow(), WM_KEYDOWN, VK_SNAPSHOT, 0) // Is lParam = 0, a problem here?
/* Key Release */ 
SendMessage(GetDesktopWindow()), WM_KEYUP, VK_SNAPSHOT, 0) 

编码语言:C,环境:Microsoft Visual Studio 2022、Windows 10 或 Windows 11。

请考虑这一切并帮助我!每一个帮助、评论和回答都将受到赞赏!请理解,一切都是为了合理使用,游戏制造商在截屏方面没有问题,我不知道他们为什么要阻止这一点。

其他向我展示如何进行屏幕截图的方法将对我有很大帮助!


None

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

如何使用 Send Message() 而不是 SendInput() 来模拟硬件按键按下? 的相关文章

  • C# 锁(mylocker) 不起作用

    我有很多 Web 服务调用 异步 在回调中 我会将结果绘制到 Excel 中 我想同步绘图方法 所以我使用以下内容 但是 从我在 Visual Studio 中追踪到 每次 lock locker 都会成功 并且有许多线程运行clearco
  • 如何在 C++ 中对四元结构进行有效排序?

    我有一个包含 x y z 和 w 成员的结构 如何高效排序 在 C 中首先按 x 然后按 y 按 z 最后按 w 如果你想实现字典排序 那么最简单的方法是使用std tie实现小于或大于比较运算符或函子 然后使用std sort http
  • 如何正确实现带有 close 方法的处置模式(CA1063)

    框架设计指南 第二版 第 327 页 说 考虑提供方法Close 除了Dispose 如果接近 是该领域的标准术语 这样做时 重要的是使 Close 实现与Dispose并考虑实施IDisposable Dispose方法明确 因此 按照提
  • 如何有效地左填充字节数组

    假设我有一个数组 LogoDataBy byte 0x00000008 0x00000000 0x41 0x00000001 0x42 0x00000002 0x43 0x00000003 0x44 0x00000004 0x31 0x00
  • 如何在方法模板中使用模板类型的引用传递参数?

    我目前正在努力编译以下代码 首先是包含带有方法模板的类的头文件 ConfigurationContext h class ConfigurationContext public template
  • 如何获取 PropertyGrid 的单元格值 (c#)?

    如何在 C 中获取属性网格项和项的值 例如 Name Ali LastName Ahmadi Name 和 LastName 是 propertygrid 的 2 个属性 PropertyGrid只是对象的组件模型表示的视图 我会说 查看组
  • MouseDoubleClick 事件不会冒泡

    我的场景经过简化 我有一个包含员工行的 ListView 在每个员工行中 都有 增加 和 减少 按钮来调整他的工资 假设在我的程序中 双击 员工 行意味着 解雇此人 The problem是当我快速单击 增加 时 这会触发 ListView
  • DataGridView小数不排序

    好吧 我有一个 DataGridView 它的数据绑定如下 dataGridViewChartOre AutoGenerateColumns false dataGridViewChartOre DataSource xml GetOreC
  • 关于 FirstOrDefault 或 SingleOrDefault

    FirstOrDefault 或 SingleOrDefault 将返回什么类型的数据 假设我的查询返回 3 条记录 例如 empid ename salary 1 joy 1500 2 rob 4500 3 jen 6500 所以如果我们
  • 获取RFC返回的嵌套结构的值?

    我是 C 新手 我有 rfc 它以嵌套结构的形式从 SAP 系统返回数据 但是当我使用以下方式获取该数据时 IrfcTable table rfc getTable exporting parameter et customer 它仅返回第
  • OpenMP 和 C++:this 指针

    Is thisOpenMP 中始终共享指针 尽管编译器不会抱怨以下代码default none pragma omp parallel for default none shared n for SInt i 0 i lt n i f i
  • 如何在PropertyGrid中自定义绘制GridItem?

    我想以与所有者在 ListView 详细信息 和其他控件中绘制项目类似的方式在 PropertyGrid 中绘制属性值 如果将属性声明为 Color 类型 则其值将使用字符串描述旁边的颜色样本来绘制 如果属性是图像类型 则在字符串描述旁边绘
  • 为什么 g++ 在编译的二进制文件中存储类名?

    我注意到如果我跑strings在我编译的程序上g 输出包含它使用的各种类的名称 该程序是用 O3并且没有 g or p 并且当我剥离二进制文件时 类名仍然存在 我想知道为什么有必要g 将此信息存储在二进制文件中 出现的类名似乎都是使用虚函数
  • Sharepoint 的 CAML 查询中的日期时间比较

    我正在尝试从共享点列表中获取某些项目 具体取决于自定义列中的日期 我已经使用 U2U Caml Builder 创建了查询 这很有效 但是当我将其放入 Web 部件中自己的代码中时 它总是返回列表中的所有项目 这是我的代码 DateTime
  • XSD、泛型和 C# 类的困境

    我有以下简单的 XSD 文件
  • 如何正确对齐 WPF GeometryGroup 中的路径?

    我正在使用一个GeometryGroup在圆的中心绘制一个符号 下面的示例显示了我在对此进行实验时的尝试之一 它具有从同一原点 32 32 出发的三条直线
  • 在 C# 中设置风扇速度

    我知道以前有人问过这个问题 但我似乎无法让它发挥作用 我已调用以下内容 using System Management using System Management Instrumentation using System Runtime
  • 我可以创建一个 List> 吗?

    我正在尝试创建一个列表WeakReference使用 4 5 泛型实现 这样我就可以避免类型检查和转换WeakReference目标 但 WeakReference
  • 创建进程的多个子进程并维护所有 PID 的共享数组

    我已经分叉了几次 并用 C 创建了一堆子进程 我想将它们所有的 PID 存储在一个共享数组中 PID 的顺序并不重要 例如 我创建了 32 个进程 我想要一个 32 个整数长的数组来存储每个 PID 并且每个进程都可以访问 最好的方法是什么
  • 如何在 C# 中将 json 转换为平面结构

    我正在尝试用 C 编写函数 将 JSON 转换为键 值对 它应该支持数组 例如下面的 JSON title title value components component id id1 menu title menu title1 tit

随机推荐

  • 如何读取 Micronaut 中的应用程序属性?

    我使用指南将 AWS SES API 集成到我的 Micronaut Groovy 应用程序中在 micronaut 中发送邮件 http guides micronaut io micronaut email groovy guide i
  • 在 C++ 构造函数中分配内存的正确方法是什么?

    这是通过分配内存的正确方法new在 C 构造函数中 参数列表中的第一种方式 class Boda int memory public Boda int length memory new int length Boda delete mem
  • 用于左包装字节元素的高效 sse shuffle mask 生成

    使用 sse 优化以下代码的有效方法是什么 uint16 t change1 uint8 t pSrc uint8 t pDest if change1 0x0001 pDest pSrc 0 if change1 0x0002 pDest
  • 如何从保存的 XGBoost 模型获取参数

    我正在尝试使用以下参数训练 XGBoost 模型 xgb params objective binary logistic eval metric auc lambda 0 8 alpha 0 4 max depth 10 max delt
  • 闪亮降级fontawesome 5至4

    我正在做一个与 fontawesome 4 7 非常相关的闪亮项目 它给我们带来了巨大的价值 作为 fontawesome 的免费用户 我认为升级到 5 3 1 没有任何优势 许多免费图标变得更加丑陋 粗糙 并且必须付费购买专业版才能获得类
  • Windows 8 上的 Visual Studio 2008/2010 - 问题?

    我正在寻找有关在 Windows 8 x64 上使用 Visual Studio 2008 和 2010 的问题所提供的任何信息 我已经找到了以下内容article http support microsoft com kb 2735834
  • 结合网格/包 Tkinter

    我知道过去关于网格和包有很多问题 但我只是不明白如何将两者结合起来 因为我在两个方向 行 列 扩展我的 表格 时遇到困难 我希望按钮保持相同的大小 但始终位于窗口底部 然而 我希望通过调整窗口大小来自动扩展 表格 但似乎无法使其工作 将 w
  • iOS 中的 Crashlytics 无法继续执行 Fabric 应用程序中的“构建您的项目”

    我正在为我的 iOS 应用程序安装 Crashlytics 我通过他们的网站链接下载了它 并完成了集成框架 添加运行脚本等的所有步骤 我遇到了问题 因此我删除了框架并决定重新开始并尝试全新安装 但是 Fabric 应用程序更新到了较新的版本
  • 解析推送通知:发生另一个错误

    自从昨晚用 Parse 测试以来 我遇到了一个奇怪的问题 我能够很好地发送推送通知 但现在当我通过在线解析推送通知工具发送推送通知时 我的推送通知都没有被发送 Edited好吧 看来这只是本地环境的问题 当我测试推送通知到通过试飞安装的测试
  • 拥有.apk可以提取其源代码。 Android 应用程序安全吗? [复制]

    这个问题在这里已经有答案了 我开发 Android 应用程序 其中一些代码非常私密和机密 我将加密算法放入我的代码中以提高安全性 但最近我读到 当人们拥有 apk 文件时 他们可以 100 正确地提取 java 源代码Source http
  • 为什么我的 Trie 查找比标准 F# Map 的查找慢?

    所以 我只是从 OCaml 移植了 Trie 不幸的是 就 tryFind 而言 它的运行速度比标准 Map 慢 我不明白这一点 特里树似乎应该更快 F 的代码库是否以某种特殊方式构建 以使它们比用户通常部署的代码更快 这是代码
  • XSD 指定在 XML 中只能使用一次的属性

    拥有一个具有多个属性的复杂类型
  • C++ 复合模板类工厂

    是否可以制作一个复合模板类工厂而无需手动指定所有组合 我的意思是如果我有这些课程 class CompositeBase template lt typename C1 typename C2 typename C3 gt class Co
  • log4net的线程安全

    似乎有一些关于log4net是否线程安全的讨论 共识是框架是线程安全的 但appender不是 需要正确使用才能实现线程安全 有人可以对此进行一些说明 并可能给出以线程安全方式使用 RollingFileAppender 的示例吗 是否需要
  • 如何将多个属性绑定连接成一个

    我有一个 OData 源 它提供的结果行包含first name last name 我想将它们显示在一个表中 其中有一列名为全名 我正在尝试使用 JSView 它似乎比 XML 更简洁 我可以像这样进行 1 1 绑定 var templa
  • 在任何情况下,直接返回结构是一种好的做法吗?

    IMO 所有直接返回结构的代码都可以修改为返回指向结构的指针 什么时候直接返回结构是一种好的做法 怎么修改 返回指向函数内结构体静态实例的指针 从而使函数不可重入 或者通过返回一个指向堆分配结构的指针 调用者必须确保释放该结构并正确执行此操
  • 错误:在ExternalContext 中未找到/login.xhtml 作为资源

    我将 JBoss 7 1 与 JSF 2 1 Prime Faces 一起使用 并不断遇到标题中列出的错误 我已经尝试了这里提出的许多建议 但最终都出现了相同的错误 文件结构为 WEB INF faces login xhtml 我在 we
  • 如何限制Stream按顺序运行,并防止它并行运行?

    我有一个方法返回从自定义分割器生成的流 分离器并不安全 由于分离器并不安全 并且它保持状态 因此我想防止它并行运行 有没有办法prevent并行运行返回的流 我无法找到任何执行此操作的文档或示例 我确实找到了一个sequential 方法上
  • 可变参数宏:无法通过“...”传递非平凡可复制类型的对象

    我正在尝试为日志机制编写一个宏 我写了一个可变参数宏 但它不起作用std string 代码如下所示 include
  • 如何使用 Send Message() 而不是 SendInput() 来模拟硬件按键按下?

    我一直在尝试对阻止 Windows GDI API 可能通过 API 挂钩 的游戏进行屏幕捕获 因此我无法使用旧的BitBlt 不幸的是 用于捕获屏幕 每当我打电话BitBlt 它失败并显示错误代码 126 ERROR MOD NOT FO