C# 使用WinAPI模拟鼠标点击warcraft3按钮

C# 使用WinAPI模拟鼠标点击warcraft3按钮,c#,winapi,C#,Winapi,我想知道是否有可能得到魔兽争霸3游戏中任何按钮的手柄?试图通过spy++和Control Viewer获取,但只有主WC3窗口可用。 有什么想法或建议吗 我试着模拟点击按钮。我认为使用按钮的坐标可以做到这一点,但我不确定是否可以计算所有屏幕分辨率的坐标。如果我弄错了什么地方,请纠正我 提前谢谢大家 添加 WinAPI int x = 700; int y = 70; int lParam = ((x << 16) | (y & 0xffff)); int parentWind

我想知道是否有可能得到魔兽争霸3游戏中任何按钮的手柄?试图通过spy++和Control Viewer获取,但只有主WC3窗口可用。
有什么想法或建议吗

我试着模拟点击按钮。我认为使用按钮的坐标可以做到这一点,但我不确定是否可以计算所有屏幕分辨率的坐标。如果我弄错了什么地方,请纠正我

提前谢谢大家

添加

WinAPI

int x = 700;
int y = 70;
int lParam = ((x << 16) | (y & 0xffff));
int parentWindow = FindWindow("Warcraft III", "Warcraft III");
SendMessage(parentWindow, WM_LBUTTONDOWN, IntPtr.Zero, new IntPtr(lParam));
SendMessage(parentWindow, WM_LBUTTONUP, IntPtr.Zero, new IntPtr(lParam));  
这样的代码根本不起作用


非常感谢您的帮助……

我相信魔兽争霸III使用DirectX。因此,您应该寻找如何欺骗DirectX输入,而不是Win32 API

相关问题:


使用spy++我发现,当我们进行普通点击时,魔兽争霸会将MK_按钮作为wParam获取PostMessage()。因此,要在魔兽争霸中模拟鼠标点击,您需要发送PostMessage()而不是SendMessage()

代码如下:

        IntPtr parentWindow = (IntPtr)WinApi.FindWindow("Warcraft III", "Warcraft III");
        int X = 770;
        int Y = 127;
        Point temp = new Point(X, Y);
        IntPtr lParam = (IntPtr)((temp.Y << 16) | temp.X);
        IntPtr wParam = IntPtr.Zero;
        WinApi.PostMessage(parentWindow, WM_LBUTTONDOWN, (IntPtr)MK_LBUTTON, lParam);
        WinApi.PostMessage(parentWindow, WM_LBUTTONUP, wParam, lParam);  
IntPtr parentWindow=(IntPtr)WinApi.FindWindow(“魔兽争霸III”、“魔兽争霸III”);
int X=770;
int Y=127;
点温度=新点(X,Y);

IntPtr lParam=(IntPtr)((临时Y精灵正在前往80级?:))呵呵,没什么特别的,只是要征服这个悲惨的世界;)嗨,抱歉迟到了。你8年前问过这个问题:)你能分享一下你在这方面的经验吗?我也试着这么做,这是我的问题,但没有人能帮我。你能看一看并给我提些建议吗?虽然我懂俄语,但我会用英语回答。很抱歉这么长时间没有回复。Tbh我不认为我能帮上忙,因为那是太久以前的事了,我甚至丢失了在我的案例中工作的源代码。我所能说的就是它起作用了。也许接受答案中的代码片段可以提供某种帮助。哦,我试着做一些原型,但没有成功。请看主题的版本。我已经达到了我想要的结果,似乎我们可以进行基于坐标的仿真,而不是按钮一。如果有兴趣,请看我的答案。太好了。我建议你发布一个小代码来展示你是如何做到这一点的,然后如果你认为这是最好的,你可以随意接受自己的答案。
        IntPtr parentWindow = (IntPtr)WinApi.FindWindow("Warcraft III", "Warcraft III");
        int X = 770;
        int Y = 127;
        Point temp = new Point(X, Y);
        IntPtr lParam = (IntPtr)((temp.Y << 16) | temp.X);
        IntPtr wParam = IntPtr.Zero;
        WinApi.PostMessage(parentWindow, WM_LBUTTONDOWN, (IntPtr)MK_LBUTTON, lParam);
        WinApi.PostMessage(parentWindow, WM_LBUTTONUP, wParam, lParam);