3

ウォークラフト3ゲームのボタンを操作できるかしら?spy++とControlViewerを介して取得しようとしましたが、メインの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));  

このようなコードは、Warcraft3ウィンドウを離れた後もアクティブなままになっているボタンを押します。

直接入力

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

そのようなコードは何もしません。

どんな助けでも大歓迎です...

4

2 に答える 2

4

WarcraftIIIはDirectXを使用していると思います。したがって、Win32 APIではなく、DirectX入力をスプーフィングする方法を探す必要があります。

関連する質問:

于 2012-07-24T18:40:56.510 に答える
3

spy ++を使用して、通常のクリックを実行すると、WarcraftはMK_BUTTONをwParamとしてPostMessage()を取得することがわかりました。したがって、warcraftでマウスクリックをシミュレートするには、SendMessage()ではなくPostMessage()を送信する必要があります。

コードは次のとおりです。

        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-26T15:12:54.407 に答える