我想知道是否有可能得到魔兽争霸3游戏的任何按钮?试图通过spy++和Control获得它,但是只有主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));
}这样的代码一点也不起作用。
任何帮助都是非常感谢的。
发布于 2012-07-26 15:12:54
使用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); 但是,按钮的所有屏幕分辨率的通用坐标仍然存在问题。
发布于 2012-07-24 18:40:56
我相信魔兽争霸III使用DirectX。因此,您应该寻找如何欺骗DirectX输入,而不是Win32 API。
相关问题:
https://stackoverflow.com/questions/11637208
复制相似问题