Изменение позиции мыши C++ (с поддержкой игр)

normalped

Участник
Автор темы
47
17
Приветствую! Пытаюсь изменить позицию мыши через с++ на windows, способ должен поддерживать игры. Я нашел два способа:

1. Работает отлично, но mouse_event считается устаревшим методом.
C++:
static void move(int x, int y) { // Абсолютное позиционированние
    int ax = (x * 65536) / GetSystemMetrics(0);
    int ay = (y * 65536) / GetSystemMetrics(1);
    mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, ax, ay, 0, 0);
}

2. Работает буд-то под нехилой дозой изменяя позицию вообще непонятно как.
C++:
static void input(int x, int y) { // Относительное позиционированние
    INPUT input;
    input.type = INPUT_MOUSE;
    input.mi.dx = x;
    input.mi.dy = y;
    input.mi.dwFlags = MOUSEEVENTF_MOVE;
    SendInput(1, &input, sizeof(input));
}

Кому интересно как я получаю позицию:
C++:
static POINT position() {
    SetProcessDPIAware();
    POINT pos;
    GetCursorPos(&pos);
    return pos;
}

Допустим если выполнить:
C++:
pos(); // Выводит в консоль позицию
Mouse::input(100, 0);
pos();
Я получу в консоли это "чудо" (вообще не то, на что я расчитывал):
Код:
805 55
1012 55

Копаясь в интернете я нашел якобы решение, но оно не совсем спасает. Можно изменить код:
C++:
input.mi.dx = (x / 1920.0) * 1080; // Было просто x
input.mi.dy = (y / 1920.0) * 1080; // Было просто y
Теперь все куда точнее, но бывают моменты, когда разница составляет 10+ пикселей, это не дело. Но такое поведение характерно тем моментам, когда изменяются две оси, если только одна (например Mouse::input(100, 0);) - все работает нормально, то есть мышь реально переместится четко на 100 пикселей вправо.
Еще можно добавить флаг MOUSEEVENTF_ABSOLUTE к MOUSEEVENTF_MOVE, но тогда в играх работать ничего не будет.

Такое поведение второго способа мне не нравится, надо шо то с ним делать. Я уже перелазил весь интернет и ничего толком не нашел под мой случай. Буду благодарен вашим предложениям!

UPD: Во втором способе используются не пиксели, а какие то mickey (маусы наверное), но шо это - не ясно...
 
Последнее редактирование:
  • Нравится
Реакции: samp2008