- 47
- 17
Приветствую! Пытаюсь изменить позицию мыши через с++ на windows, способ должен поддерживать игры. Я нашел два способа:
1. Работает отлично, но mouse_event считается устаревшим методом.
2. Работает буд-то под нехилой дозой изменяя позицию вообще непонятно как.
Кому интересно как я получаю позицию:
Допустим если выполнить:
Я получу в консоли это "чудо" (вообще не то, на что я расчитывал):
Копаясь в интернете я нашел якобы решение, но оно не совсем спасает. Можно изменить код:
Теперь все куда точнее, но бывают моменты, когда разница составляет 10+ пикселей, это не дело. Но такое поведение характерно тем моментам, когда изменяются две оси, если только одна (например
Еще можно добавить флаг MOUSEEVENTF_ABSOLUTE к MOUSEEVENTF_MOVE, но тогда в играх работать ничего не будет.
Такое поведение второго способа мне не нравится, надо шо то с ним делать. Я уже перелазил весь интернет и ничего толком не нашел под мой случай. Буду благодарен вашим предложениям!
UPD: Во втором способе используются не пиксели, а какие то mickey (маусы наверное), но шо это - не ясно...
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
Mouse::input(100, 0);
) - все работает нормально, то есть мышь реально переместится четко на 100 пикселей вправо.Еще можно добавить флаг MOUSEEVENTF_ABSOLUTE к MOUSEEVENTF_MOVE, но тогда в играх работать ничего не будет.
Такое поведение второго способа мне не нравится, надо шо то с ним делать. Я уже перелазил весь интернет и ничего толком не нашел под мой случай. Буду благодарен вашим предложениям!
UPD: Во втором способе используются не пиксели, а какие то mickey (маусы наверное), но шо это - не ясно...
Последнее редактирование: