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

时间:2012-07-24 18:38:21

标签: c# winapi

我想知道是否可以处理魔兽争霸3游戏的任何按钮?试图通过间谍++和控制查看器获取它,但只有主要的WC3窗口是可用的 那么任何想法或建议?

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

提前感谢大家!

ADDITION

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窗口后保持活动状态的任何按钮。

DIRECT INPUT

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

这样的代码什么都不做。

非常感谢任何帮助...

2 个答案:

答案 0 :(得分:4)

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

相关问题:

答案 1 :(得分:2)

使用spy ++我发现,当我们进行普通点击时,魔兽用MK_BUTTON作为wParam获取PostMessage()。因此,要在warcraft中模拟鼠标单击,您需要发送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);  

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