1

私はDirectxで書かれたゲームを持っています(私のものではなく、MMOゲームです)。ゲームウィンドウはアクティブではありません(最小化されていません。他のウィンドウの後ろにありますが、可能であれば最小化することもできます)。

x、y位置でのマウスクリックをシミュレートしたい。ゲーム内をクリックしても、Spy++はメッセージに何も表示しません。

今のところ私はまさにそれをしました:

private void start_Click(object sender, EventArgs e)
    {
        IntPtr ActualWindow = GetActiveWindow();

        ShowWindow(hWnd, ShowWindowCommands.Restore); //show game window
        Thread.Sleep(50);                             //a little slow down
        ClickOnPoint(hWnd, new Point(692, 87));       //click on x,y
        Thread.Sleep(50);                             //again a little slow down
        ShowWindow(hWnd, ShowWindowCommands.Minimize);//minimize game window
        ShowWindow(ActualWindow, ShowWindowCommands.Restore);//restore last active window
//sleep is needed for click, if i will do it too fast game will not detect the click
    }

private void ClickOnPoint(IntPtr wndHandle, Point clientPoint)
    {
        POINT oldPoint;
        GetCursorPos(out oldPoint);

        ClientToScreen(wndHandle, ref clientPoint);

        /// set cursor on coords, and press mouse
        SetCursorPos(clientPoint.X, clientPoint.Y);
        mouse_event(0x00000002, 0, 0, 0, UIntPtr.Zero); /// left mouse button down
        Thread.Sleep(18);
        mouse_event(0x00000004, 0, 0, 0, UIntPtr.Zero); /// left mouse button up
        Thread.Sleep(15);

        /// return mouse 
        SetCursorPos(oldPoint.X, oldPoint.Y);
    }

ポイントをクリックしてゲームウィンドウを復元し、ゲームウィンドウを最小化します。

それはうまくいきますが、私がマウスを動かしていないときだけ...

私は何か他のものを探します。実際に動かさずにマウスをクリックしたい。ゲームでそれを行うことさえ可能ですか?ゲームなのでクリックしたいボタンのハンドルがありません...

PS私の英語でごめんなさい。

4

2 に答える 2

1

非アクティブなウィンドウでのマウス クリックをシミュレートするコードの一部は次のようになります。

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool PostMessage(int hWnd, uint Msg, int wParam, int lParam);

// int MouseX
// int MouseY
// public static readonly uint WM_LBUTTONUP = 0x202;
// public static readonly uint WM_LBUTTONDOWN = 0x201;

int lparam = MouseX & 0xFFFF | (MouseY & 0xFFFF) << 16;
int wparam = 0;
PostMessage(windowHandle, WM_LBUTTONDOWN, wparam, lparam);      
Thread.Sleep(10);  
PostMessage(windowHandle, WM_LBUTTONUP, wparam, lparam);
于 2012-12-31T18:30:29.953 に答える