2

C++ で現在のマウスの dpi 設定を取得する方法はありますか?

問題は、マウス移動メッセージをシステムに送信すると、マウスの dpi 解像度に応じて異なるカーソル位置になることです。

編集:

マウスからの 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));

これが誰かに役立つことを願っています:)

4

2 に答える 2

1

マウス dpi の取得に関する質問は、以前ここで尋ねられました: Windows で「ポインター解像度」(またはマウス DPI) を取得するにはどうすればよいですか? -そこの答えは、それが不可能であることを示唆しているようです。これは、使用しているマウスのハードウェア/ドライバーに固有である可能性が高いため、理にかなっています。

ただし、カーソル位置の設定に関しては、 のような関数を使用し、SetCursorPos()メッセージを操作している場合、操作WM_MOUSEMOVEしている座標は相対座標ではなく絶対座標であり、マウスの dpi にまったく依存するべきではありません。

于 2013-02-15T11:59:45.673 に答える
0
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);
于 2016-02-22T15:17:23.437 に答える