【发布时间】:2020-07-21 21:41:25
【问题描述】:
问题是我已经有一个工作程序可以向不在 TOPLEVEL 上的非活动窗口发送点击,但它不适用于所有窗口。 我无法理解这种行为的原因是什么。 当我用spy++过滤消息时,和真正的鼠标点击完全一样,但最终游戏没有响应。
最初,我用 python 编写了它,但最后它对我来说并不奏效,尽管我没有经验,但我还是决定尝试 C++。 以下是我设法用 C++ 编写的内容。
#include <stdio.h>
#include <cstdlib>
#include <windows.h>
#include <winuser.h>
#include <conio.h>
LPCTSTR WindowName = L"Raid: Shadow Legends";
HWND hMU = FindWindow(NULL, WindowName);
int main() {
if (hMU)
{
int x = 16; //selected values based on the readings of spy ++
int y = 266; //
WINDOWPOS wp = { hMU, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE };
SendMessage(hMU, WM_SETCURSOR, (WPARAM)hMU, MAKELPARAM(HTCLIENT, WM_MOUSEMOVE));
SendMessage(hMU, WM_MOUSEACTIVATE, (WPARAM)hMU, MAKELPARAM(HTCLIENT, WM_LBUTTONDOWN));
SendMessage(hMU, WM_WINDOWPOSCHANGING, 0, (LPARAM)& wp);
SendMessage(hMU, WM_NCPAINT, 1, 0);
SendMessage(hMU, WM_WINDOWPOSCHANGED, 0, (LPARAM)& wp);
SendMessage(hMU, WM_ACTIVATEAPP, 1, 0);
SendMessage(hMU, WM_NCACTIVATE, 1, 0);
SendMessage(hMU, WM_ACTIVATE, WA_CLICKACTIVE, 0);
SendMessage(hMU, WM_SETFOCUS, 0, 0);
SendMessage(hMU, WM_SETCURSOR, (WPARAM)hMU, MAKELPARAM(HTCLIENT, WM_LBUTTONDOWN));
PostMessage(hMU, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y));
PostMessage(hMU, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(x, y));
SendMessage(hMU, WM_CAPTURECHANGED, 0, 0);
}
}
代码可能是多余的,甚至是糟糕的,但我没有注意它。我遵循了鼠标单击时精确复制消息的路径。非常遗憾。 我会接受任何帮助。 Python 解决方案也不错。
【问题讨论】:
-
或许游戏采用了反作弊措施。
-
@Sam Varshavchik 这是可能的。有趣的是,同样的游戏完全接受了我的模拟击键代码,但它不适用于模拟鼠标点击。
-
模拟输入不仅仅是发送窗口消息(仅供参考,其中一些消息需要发布
PostMessage(),而不是发送 i> 与SendMessage())。模拟输入的正确方法是使用SendInput(),但如果模拟输入的坐标被另一个窗口覆盖,那将不起作用。游戏的窗口是否会对 UIAutomation 做出反应?