使用win api模拟鼠标点击warcraft3按钮

Posted

技术标签:

【中文标题】使用win api模拟鼠标点击warcraft3按钮【英文标题】:simulating mouse click on the warcraft3 button using win api 【发布时间】:2012-07-24 18:38:21 【问题描述】:

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

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

提前谢谢大家!

添加

WIN API

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));  

这样的代码将按下我离开魔兽争霸3窗口后保持活动状态的任何按钮。

直接输入

public void testMouse()
        
            INPUT input_down = new INPUT();
            input_down.mi.dx = 700;
            input_down.mi.dy = 70;
            input_down.mi.mouseData = 0;
            input_down.mi.dwFlags = (int)MOUSEEVENTF.LEFTDOWN;

            INPUT input_up = input_down;
            input_up.mi.dwFlags = (int)MOUSEEVENTF.LEFTUP;

            INPUT[] input =  input_down, input_up ;
            SendInput(2, input, Marshal.SizeOf(input_down));
        

这样的代码什么都不做。

非常感谢任何帮助...

【问题讨论】:

精灵要升到80级了? :)))) 嘿嘿,没什么特别的,就是要征服这个悲惨的世界;) 嗨,很抱歉迟到了。你 8 年前问过这个问题 :) 你能分享一下你的经验吗?我正在尝试做同样的事情,这是我的问题***.com/questions/65316317/… 但没有人可以帮助我。你能看一下并给我一些建议吗? Эх, просто проигнорировал мой коммент.. @Gepard 嘿,伙计,虽然我知道我是俄语,但我会用英语回答。很抱歉这么长时间没有回复。 Tbh 我不认为我可以帮助解决这个问题,因为那是很久以前的事了,我什至丢失了恰好在我的案例中工作的源代码。我只能说它正在工作。也许接受答案中的代码 sn-p 可以提供某种帮助。 【参考方案1】:

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

相关问题:

directx mouse click simulation Simulate mouse move in 3D games?

【讨论】:

哦,尝试做一些原型,但没有成功。请参阅该主题的版本。 我已经达到了我想要的结果,看来我们可以进行基于坐标的仿真,而不是一键仿真。如果有兴趣,请看我的回答。【参考方案2】:

使用 spy++ 我发现,当我们做一个普通的点击时,魔兽会得到 PostMessage() 和 MK_BUTTON 作为 wParam。所以要在魔兽中模拟鼠标点击,你需要发送 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);  

但是对于所有屏幕分辨率的按钮的通用坐标问题仍然存在。

【讨论】:

太棒了。我建议您发布一些代码来展示您是如何做到这一点的,然后如果您认为这是最好的,请随时接受您自己的答案。

以上是关于使用win api模拟鼠标点击warcraft3按钮的主要内容,如果未能解决你的问题,请参考以下文章

win32API的mouse_event方法怎么用 MOOSEEVENTF_RIGHTDOWN不起使用啊,win7系统

python模拟鼠标点击window图标

.NET下如何拦截鼠标键盘消息?Win32NET来帮你

带有win32con的Python滚轮鼠标

请用Python如何模拟键盘操作

键盘怎么模拟鼠标操作