Windows — считывать настройки dpi мыши в Stack Overflow

Есть ли способ получить текущую настройку dpi мыши в c ++?

Проблема заключается в том, что отправка сообщения о перемещении мыши в систему приведет к другому положению курсора в зависимости от разрешения мыши на дюйм.

редактировать:

Я нашел решение, где мне не нужна настройка dpi от мыши. Я получаю скорость мыши с помощью SystemParametersInfo и рассчитываю расстояние перемещения:
moveDistance.x * 5.0 / mouseSpeed. 5.0 / mouseSpeed ​​- это магическое число, которое гарантирует, что расстояние перемещения всегда будет правильным.

// get mouse speed
int mouseSpeed;
mouseSpeed = 0;
SystemParametersInfo(SPI_GETMOUSESPEED, 0, &mouseSpeed, 0);

// calculate distance to gaze position
POINT moveDistance;
moveDistance.x = m_lastEyeX - m_centerOfScreen.x;
moveDistance.y = m_lastEyeY - m_centerOfScreen.y;

// 5.0 / mouseSpeed -> magic numbers, this will halve the movedistance if mouseSpeed = 10, which is the default setting
// no need to get the dpi of the mouse, but all mouse acceleration has to be turned off
double xMove = moveDistance.x * 5.0 / static_cast<double>(mouseSpeed);
double yMove = moveDistance.y * 5.0 / static_cast<double>(mouseSpeed);

INPUT mouse;
memset(&mouse, 0, sizeof(INPUT));
mouse.type = INPUT_MOUSE;
// flag for the mouse hook to tell that it's a synthetic event.
mouse.mi.dwExtraInfo = 0x200;
mouse->mi.dx = static_cast<int>(xMove);
mouse->mi.dy = static_cast<int>(yMove);
mouse->mi.dwFlags = mouse->mi.dwFlags | MOUSEEVENTF_MOVE;
SendInput(1, &mouse, sizeof(mouse));

Я надеюсь, что это помогает кому-то 🙂

1

Решение

Вопрос о получении dpi мыши был задан ранее здесь: Как я могу получить "разрешение указателя" (или мышь DPI) в Windows? — ответ, по-видимому, предполагает, что это невозможно, что имеет смысл, поскольку, скорее всего, это будет зависеть от используемого оборудования / драйвера мыши.

Хотя установка позиции курсора идет, хотя — если вы используете функцию, как SetCursorPos(), и работаем с WM_MOUSEMOVE В сообщениях координаты, с которыми вы работаете, являются абсолютными, а не относительными, и вообще не должны зависеть от dpi мыши.

1

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

INPUT mouse;
memset(&mouse, 0, sizeof(INPUT));
mouse.type = INPUT_MOUSE;
// flag for the mouse hook to tell that it's a synthetic event.
mouse.mi.dwExtraInfo = 0x200;
mouse->mi.dx = static_cast<int>(xMove);
mouse->mi.dy = static_cast<int>(yMove);
mouse->mi.dwFlags = mouse->mi.dwFlags | MOUSEEVENTF_MOVE;
SendInput(1, &mouse, sizeof(mouse));

Вместо этого вы можете использовать это:

mouse_event(MOUSEEVENTF_MOVE, xMove , yMove , NULL, NULL);
0

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