为何SendMessage对Roblox等部分应用无法发送点击指令?
问题:后台向Roblox发送鼠标点击消息无效,但其他窗口消息正常
背景
我想编写一个自动点击器,在后台给Roblox(无恶意用途)执行点击操作。已成功获取窗口句柄,发送WM_CLOSE这类指令可正常执行,但发送WM_LBUTTONDOWN和WM_LBUTTONUP鼠标点击消息时返回值为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)
已尝试的解决方法
- 切换目标窗口,确认不存在选错或未识别窗口的问题
- 按常规格式发送消息,代码如下但仍无效:
lParam = win32api.MAKELONG(100, 100) # 转换坐标为长整型 temp = win32gui.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, None, lParam) # 发送按下消息 win32gui.SendMessage(hwnd, win32con.WM_LBUTTONUP, None, lParam) # 发送释放消息 - 在其他窗口测试代码可正常运行,仅Roblox无响应
- 发送
WM_CLOSE等指令正常执行,证明窗口句柄正确:temp = win32gui.SendMessage(hwnd, win32con.WM_CLOSE, 0, 0) # 关闭窗口
可能的原因与解决方案
- Roblox输入机制特性:Roblox基于游戏引擎开发,输入处理可能依赖原始输入(Raw Input)而非标准窗口消息循环,
WM_LBUTTONDOWN这类消息无法被其识别。 - 定位正确的子窗口:
FindWindow获取的是主窗口句柄,实际接收输入的可能是主窗口内的渲染子控件。可通过win32gui.EnumChildWindows遍历子窗口,找到目标子句柄后再发送消息。 - 改用
SendInput模拟硬件输入:若必须实现后台操作,可使用SendInput模拟硬件级点击(需临时激活窗口,之后恢复原焦点),示例代码:import win32api import win32con import win32gui def simulate_click(x, y, hwnd): # 保存当前焦点窗口 original_focus = win32gui.GetForegroundWindow() # 激活目标窗口 win32gui.SetForegroundWindow(hwnd) # 移动鼠标到目标屏幕坐标 win32api.SetCursorPos((x, y)) # 模拟左键按下与释放 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0) # 恢复原窗口焦点 win32gui.SetForegroundWindow(original_focus) hwnd = win32gui.FindWindow(None, "Roblox") simulate_click(100, 100, hwnd) - 提升脚本权限:确保脚本以管理员权限运行,部分游戏会限制普通权限程序的输入模拟操作。
内容的提问来源于stack exchange,提问作者Blue Robin
相关产品推荐
相关产品推荐

