为什么 SendMessage 对某些应用程序不起作用?

2024-07-04

背景:

我试图编写一个自动点击器来在后台点击应用程序(Roblox https://en.wikipedia.org/wiki/Roblox,不尝试做任何恶意的事情)。我能够获取该窗口并执行诸如关闭它之类的命令。但是,当尝试将点击发送到窗口时,它会返回 0。(我正在使用 SendMessage,因此不会激活窗口。)

最小可重现示例:

import win32gui
import win32con
import win32api
hwnd = win32gui.FindWindow(None, "Roblox")

while True:
    lParam = win32api.MAKELONG(100, 100)
    temp = win32gui.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, None, lParam)
    win32gui.SendMessage(hwnd, win32con.WM_LBUTTONUP, None, lParam)
    print(temp)

我尝试过的事情:

  1. 我尝试更改窗口以查看是否是错误的窗口,或者是否没有看到该窗口

  2. 我尝试正常发送消息:

    lParam = win32api.MAKELONG(100, 100)  # Get the coordinates and change to long
    temp = win32gui.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, None, lParam)  # Send message to handle
    win32gui.SendMessage(hwnd, win32con.WM_LBUTTONUP, None, lParam)  # Release key from sent message to handle
    
  3. 我在其他窗口上尝试过,它有效,但不适用于 Roblox

  4. 我尝试使用其他命令并且它有效,但点击却不起作用。这有效:(所以我知道这是正确的窗口)

    temp = win32gui.SendMessage(hwnd, win32con.WM_CLOSE, 0, 0)  # Close window with SendMessage
    

你不能这样做。

让我们首先重新表述问题陈述,以便更容易理解,为什么会出现这种情况:

“我如何说服一个选择忽略鼠标输入消息(无论是决定还是巧合)的程序来确认鼠标输入消息?”

事实证明,这部分实际上已经解决了。作为文档WM_LBUTTONDOWN https://learn.microsoft.com/en-us/windows/win32/inputdev/wm-lbuttondown notes:

如果应用程序处理此消息,它应该返回零。

您得到的结果为零,因此没有理由质疑消息已按照应用程序认为必要的程度进行处理这一事实。这大概会掉下来“巧合”分支,应用程序对鼠标消息不感兴趣,而只是将它们传递给DefWindowProc https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-defwindowprocw,厨房水槽,用于存放所有相关性不足以忽略的消息。

Key insight here is: A program that needs to process and respond to mouse input can decide to ignore mouse input messages1. (And clients that are based on mouse message handling can easily identify fake input messages https://devblogs.microsoft.com/oldnewthing/20050530-11/?p=35513, too, and respond by, y'know, not responding altogether.)

因此,从本质上讲,发送(或发布)假鼠标消息是行不通的。可靠。曾经。

这基本上给你留下了 3 种选择:

  • 用户界面自动化 https://learn.microsoft.com/en-us/windows/win32/winauto/entry-uiauto-win32
  • 访问自定义自动化界面
  • SendInput https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput(合并版本keybd_event and mouse_event)

列出前两个选项只是为了完整性。它们通常可用于积极支持自动化的应用程序。游戏通常不会,并且防范这些途径既简单又便宜:应用程序不必这样做anything.

SendInput也行不通。就系统而言,注入的输入的处理方式与任何其他输入相同(这博客文章 https://devblogs.microsoft.com/oldnewthing/20140213-00/?p=1773提供了一个有用的说明)。具体来说,当在窗口上单击鼠标时,该窗口将进入前台。所以这不符合申请的要求“在后台”.

即使情况并非如此,注入的输入也可以轻松可靠地识别。 A低级鼠标钩子 https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644986(v=vs.85)就是获得一个所需的全部MSLLHOOKSTRUCT https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-msllhookstruct, whose flags字段很容易就泄露了这些信息。由于低级钩子能够阻止输入传递到系统,因此return 1;这就是过滤掉这些输入事件所需的全部内容。


这涵盖了所有支持的外部应用程序自动化方法。这是一条死胡同,死得不值得。


现在,如果使用虚假输入自动化在后台运行的应用程序总结了要求,那么您唯一的选择就是在虚拟化环境中运行应用程序(这确保单击保持在虚拟环境内,并且不会使应用程序到前面来)。请记住上述所有限制still申请,并且您不能使用上述任何方法。您必须实现并安装一个自定义鼠标驱动程序,该驱动程序生成的输入与真正的硬件源输入事件无法区分。

但即便如此,应用程序仍然有办法发现它们正在虚拟化环境中运行,并在运行时拒绝运行。


底线是:作弊很难。Really难的。而且您的问题没有简单的解决方案。


1 Mouse input messages are generated by the system as a convenience. They represent a useful (and lossy) abstraction over hardware input events. The full fidelity of those hardware input events is generally not required by "standard" applications.
Games, on the other hand, will usually use lower-level input processing infrastructure, such as Raw Input https://learn.microsoft.com/en-us/windows/win32/inputdev/raw-input, and not even look at any of the higher-level processing artifacts.

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

为什么 SendMessage 对某些应用程序不起作用? 的相关文章

  • Socket:Python中的2路通信

    我想要在 Python 中进行双向通信 我想绑定到一个客户端可以连接的套接字 然后服务器和客户端可以彼此 聊天 我已经有了基本的监听器 import socket HOST localhost PORT 50008 s socket soc
  • 如何在列表列表中找到元素和最大的列表?

    我有一个列表列表 x 1 2 3 4 5 6 7 8 9 2 2 0 我想得到列表中元素之和最大的列表 在这种情况下 7 8 9 我宁愿有一个幻想map or lambda或列表理解方法比for while if loop 此致 max提出
  • 将今天日期设置为模型中的默认值

    如何在模型中将默认值设置为今天日期 我的型号 vote date models DateField 投票日期 null False Blank False 所有答案都不能解决最初的问题 重述问题 如何将日期字段的默认值设置为今天的日期并仍然
  • 导入文本文件:没有要从文件中解析的列

    我正在尝试从 sys stdin 获取输入 这是hadoop 的map reducer 程序 输入文件为txt格式 数据集预览 196 242 3 881250949 186 302 3 891717742 22 377 1 8788871
  • Flask:如何从模板目录下提供静态文件?

    我使用 Flask 并想要更改我的资产文件夹目录 这是我的文件夹结构 python static js img font css templates default css js img venv app py 我想移动静态文件夹下的所有文
  • 使用 bs4 进行 HTML 解析

    我正在解析一个 HTMl 页面 并且很难弄清楚如何在没有类或 id 的情况下提取某个 p 标签 我试图用经纬度到达 p 标签 这是我当前的代码 import bs4 from urllib import urlopen as uReq th
  • 从子列表中切片元素 - Python

    我想从中返回数字 5 list 1 1 2 3 4 5 6 我以为这会起作用 但事实并非如此 print list 1 1 1 它返回一个空列表 它是索引 1 第二个列表 和位置 1 列表中的第二个数字 这不应该起作用吗 您需要两个单独的操
  • 使用 Python 在 Yandex Images 中反向搜索图像

    我对自动化反向图像搜索感兴趣 Yandex 特别适合捕捞鲶鱼 甚至比 Google 图片还要好 因此 请考虑以下 Python 代码 import requests import webbrowser try filePath C path
  • Asyncio 函数在从脚本调用时有效,但在 Flask 路由中无效

    我是 Python 和这些库 模块的新手 我正在编写一个简单的 ping 测试网络扫描仪作为学习项目 我首先使用 asyncio 开发了一个脚本来 ping 网络上的地址 ip test py import asyncio import i
  • 上传大文件nginx + uwsgi

    堆栈 flask 0 10 uwsgi 1 4 5 nginx 1 2 3 我可以通过我的应用程序上传小文件 CONTENT LENGTH 无效 太大 跳过 nginx 日志没有显示任何有用的内容 我尝试了以下操作 但没有成功 nginx配
  • 当我将鼠标悬停在组合框项目上时引发事件

    当我将鼠标悬停在组合框项目上时 我无法找到要触发的事件 我正在使用 Windows 窗体来构建应用程序 我发现WPF有类似的东西 当我将鼠标悬停在组合框项目上时如何更改标签文本 https stackoverflow com questio
  • 如何对不同类型的列表进行排序?

    我需要使用 python 3 对列表进行排序 可能有strings integers floats or tuples etc 我目前正在尝试正确使用sort函数使用key参数如下 data sort key gen key def gen
  • 模板内嵌套 for 循环

    模型 py class Task models Model level models ForeignKey Level on delete models CASCADE todo models ForeignKey ToDo on dele
  • 如何从python3中的单行输入读取整数数组

    我想从 python3 中的单行输入读取整数数组 例如 将此数组读取到变量 列表 1 3 5 7 9 我尝试过的 arr input split 但这不会将它们转换为整数 它创建字符串数组 arr input split for i val
  • 数据集继续使用线性回归而不是决策树模型

    我想在我的数据集上使用决策树模型 但无论我做什么 它都会继续使用线性回归 数据不同 但图表仍然相同 基本上 我编写了线性回归的代码 from sklearn linear model import LinearRegression linr
  • 为什么 Python 中的元组不可变? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 python 字符串和元组是不可变的 https stackoverflow com questions 1538663 why are python strings and tuples a
  • Python,创建对象

    我正在尝试学习 python 现在我正在尝试掌握类的窍门以及如何使用实例来操作它们 我似乎无法理解这个练习问题 创建并返回一个学生对象 其姓名 年龄和专业为 与作为输入给出的相同 def make student name age majo
  • 来自 Abaqus/CAE 的 Python 多处理

    I am using a commercial application called Abaqus CAE1 with a built in Python 2 6 interpreter and API I ve developed a l
  • 在 Python 中访问 Firefox 3 cookie

    我正在尝试制作一个 python 脚本 该脚本将在 Firefox 中使用 cookie 访问网站 如果 cookielib MozillaCookieJar 支持 Firefox 3 它就会工作 有没有办法在 python 中访问 Fir
  • 使用 M1 Mac 进行 Python 多处理

    我有一台 Mac Mac Os 11 1 Python Ver 3 8 2 需要在多处理中工作 但程序不起作用 import multiprocessing def func index int print index manager mu

随机推荐

  • 查找数组中总和为指定值的所有整数对

    设计一种算法来查找数组中总和为指定值的所有整数对 我已经尝试使用哈希表来存储数组元素总和的条目来解决此问题 但这不是一个有效的解决方案 我可以使用什么算法来有效地解决这个问题 我不明白为什么哈希表方法效率低下 至少在算法分析方面 不可否认
  • 如何删除 JQGrid 中的内联删除操作

    我试图修改该问题的示例自定义 jQGrid 后操作 https stackoverflow com questions 6622779 custom jqgrid post action http ok soft gmbh com jqGr
  • 如何使用蓝色棱镜中的输入和输出参数将集合数据从流程工作室传递到对象工作室

    在 Blue Prism 中创建调用 BP Travels VBO 的演示流程 想要使用 Process Studio 中的捕获集合捕获 创建报价 选项卡中的数据 并将数据传递到 Object Studio 中对象内的集合 First ca
  • 如何在 Chisel 中使用另一个寄存器动态索引到一个寄存器

    我正在为我被告知的一种漏斗移位器编写 Chisel 代码 基本上 它获取大小为 m 位的输入并发送大小为 n 位的输出 其中 m 和 n 可以有任何关系 也可以没有关系 我将 m 位字保存在缓冲区中 然后需要动态索引到缓冲区中以获取 n 位
  • 如何(自动)生成 MVC + Entity 的 Web api 控制器或基因查询所有类型

    作为 MVC4 Entity WebAPI 的新手 我对仅仅拥有 GET POST 控制器处理程序和到数据模型的自定义映射感到沮丧 我想我要问的是有一个生成工具 例如从数据类创建控制器类 这样我就可以直接从数据执行简单的 GET 命令 制作
  • 如何在 Java 中使用 Bing 搜索 api

    我需要从 Bing 中提取搜索结果 有没有可用的Java代码来实现这一点 此 MSDN 论坛主题 http social msdn microsoft com Forums en US DataMarket thread f93738b4
  • Protobuf 版本与 Qt 冲突

    我正在尝试将 protobufs v 3 3 2 与 Qt 5 9 1 一起使用 这适用于某些 Qt 应用程序 但前提是它们是命令行程序 当我使用 Qt 和 protobufs 创建 GUI 应用程序后 我收到以下错误 libprotobu
  • 使用 Flexbox 并保持纵横比,即使内容大小不同

    SO 有很多关于维护元素的纵横比 有或没有 Flexbox 的问题 但是 我的问题略有不同 因为我想覆盖子图像元素的纵横比 确保图像覆盖元素 object fit cover 完全地 确保元素为 1 1 即完美的圆 确保隐藏溢出的图像 换句
  • Django 会话竞争条件?

    摘要 Django 会话中是否存在竞争条件 如何防止它 我在 Django 会话方面遇到了一个有趣的问题 我认为该问题涉及由于同一用户同时发出请求而导致的竞争条件 它发生在一个同时上传多个文件的脚本中 正在本地主机上进行测试 我认为这使得同
  • QTreeView 删除所有项目的装饰/展开按钮

    我想拥有我的QTreeView总是扩展所有项目 在这种情况下 所有展开按钮 装饰都是不必要的 我想摆脱它们 我怎样才能将它们全部删除 setRootIsDecorated只会删除第一层的按钮 这就是我过去针对这个问题所做的 虽然有点麻烦 但
  • 在 Powershell 中运行 Access 宏

    我尝试使用以下代码在 PowerShell v4 0 Windows 8 1 中运行 Access 2010 宏 Access New Object com Access Application Access OpenCurrentData
  • 如何解决有关 TcpListener: 请使用 TcpListener(IPAddress localaddr, int port) 的警告?

    我创建了一个新表单 在顶部我做了 using System using System Collections Generic using System ComponentModel using System Data using Syste
  • 使用 Lucene 提取英语单词词干

    我正在 Java 应用程序中处理一些英文文本 我需要对它们进行词干处理 例如 从文本 amenities amenity 中我需要获取 amenit 该函数如下所示 String stemTerm String term 我找到了 Luce
  • 在 cmd.Cmd 命令行解释器中更好地处理键盘中断

    在使用 python 的 cmd Command 创建自定义 CLI 时 如何告诉处理程序中止当前行并给我一个新的提示 这是一个最小的例子 console min py run python console min py import cm
  • SQL 和 Dapper 性能隐式转换

    我们如何防止 Dapper 中的 SQL 隐式转换 我们意识到 我们正在进行 SQL 隐式转换 导致索引扫描和死锁 Dapper 参数是 nvarchar 而 SQL 表列是 varchar 这导致我们所有的 sql 列都转换为 nvarc
  • 安全地抛出在另一个线程上创建的异常 C#

    我想在线程A中捕获异常 然后将异常对象传递给线程B 并从线程B中抛出它 这样安全吗 Thread A try Code that throws exceptions catch Exception e sendToOtherThread e
  • 垂直对齐到另一个 div 的动态高度?

    我正在尝试将一个 div 与高度动态的相邻 div 垂直对齐 我遇到的大多数方法都要求我知道父 div 的高度 但如果你看我的例子 就会发现是 右 div 驱动了整个部分的高度 我试图让 div 左 中的文本垂直居中显示在右侧的 div 上
  • LINQ to SQL 未映射的属性

    是否可以在设计器中添加自定义属性并且不将其绑定到列 我摆弄了一些设置 决定用该属性创建一个部分类 有没有办法在 ORM 设计器中显示这个字段 LINQ to SQL 设计器正在维护映射 未映射的属性需要放入单独的分部类中
  • 国际象棋棋步验证库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 NET 中是否有可用于验证国际象棋走法和模拟游戏的库 如果该库能够理解代数符号中的移动并提供简单的 A
  • 为什么 SendMessage 对某些应用程序不起作用?

    背景 我试图编写一个自动点击器来在后台点击应用程序 Roblox https en wikipedia org wiki Roblox 不尝试做任何恶意的事情 我能够获取该窗口并执行诸如关闭它之类的命令 但是 当尝试将点击发送到窗口时 它会