Как имитировать щелчок мыши в игре Directx

У меня есть игра, написанная на 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);
}

Это восстановить окно игры, нажмите на точку и сверните окно игры.

Это хорошо работает, но только когда я не двигаю мышь …

Я ищу что-то еще. Я хочу щелкнуть мышью, не двигая ее по-настоящему. Это вообще возможно сделать в игре? У меня нет ручки для кнопки, которую я хочу нажать, потому что это игра …

P.S
Извините за мой английский.

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

Другие решения

Вы можете попробовать использовать Sendiput. вот документация: https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx

Вот мой пример:

Включает в себя:

    #include <stdio.h>
#include <cstdlib>
#include <windows.h>
#include <winuser.h>
#include <conio.h>

INPUT input;
int x = 889;
int y = 451;

`// Mouse click up
input.type = INPUT_MOUSE;
input.mi.mouseData = 0;
input.mi.dx = x * float(65536 / GetSystemMetrics(SM_CXSCREEN)); //x being coord in pixels
input.mi.dy = y * float(65536 / GetSystemMetrics(SM_CYSCREEN)); //y being coord in pixels
input.mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN);
input.mi.time = 0;
SendInput(1, &input, sizeof(input));`
`
//Mouse click down
input.type = INPUT_MOUSE;
input.mi.mouseData = 0;
input.mi.dx = x * float(65536 / GetSystemMetrics(SM_CXSCREEN)); //x being coord in pixels
input.mi.dy = y * float(65536 / GetSystemMetrics(SM_CYSCREEN)); //y being coord in pixels
input.mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP);
input.mi.time = 0;
SendInput(1, &input, sizeof(input));`

And You can do something like this to make sure you are in the focused window:

HWND hWnd = ::FindWindowEx(0, 0, "YourGame - Use Spy++", 0);

DWORD dwThreadID = GetWindowThreadProcessId(hWnd, NULL);
AttachThreadInput(dwThreadID, GetCurrentThreadId(), true);

SetForegroundWindow(hWnd);
SetActiveWindow(hWnd);
SetFocus(hWnd);

AttachThreadInput(GetWindowThreadProcessId(GetForegroundWindow(), NULL),GetCurrentThreadId(), TRUE);
0

По вопросам рекламы [email protected]