【问题标题】:Simulating a click in the game window模拟游戏窗口中的点击
【发布时间】: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 做出反应?

标签: python c++ winapi pywin32


【解决方案1】:

我推荐你使用SendInput向游戏窗口发送相应的消息。

您可以参考:How to simulate mouse click in a Directx game

您可以使用AttachThreadInputSetForegroundWindowSetActiveWindowSetFocus将焦点定位到相应的窗口。

然后通过SendInput发送指定消息。

猜你喜欢
  • 1970-01-01
  • 2012-12-15
  • 2017-01-03
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多