【问题标题】:Windows - read dpi setting of mouse in c++Windows - 在 C++ 中读取鼠标的 dpi 设置
【发布时间】:2013-02-15 09:34:07
【问题描述】:

有没有办法在 c++ 中获取当前鼠标 dpi 设置?

问题是向系统发送鼠标移动消息会导致光标位置不同,具体取决于鼠标的 dpi 分辨率。

编辑:

我找到了一个不需要鼠标设置 dpi 的解决方案。我使用 SystemParametersInfo 获得鼠标速度并通过以下方式计算移动距离: moveDistance.x * 5.0 / 鼠标速度。 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));

我希望这对某人有帮助:)

【问题讨论】:

  • 您是否尝试过使用 Windows Management Instrumentation?在这里试试这个:wikipedia
  • 非常感谢 bash.d 我会通读的。 :)

标签: c++ windows mouse dpi mousemove


【解决方案1】:

之前在这里提出了有关检索鼠标 dpi 的问题:How I can get the "pointer resolution" (or mouse DPI) on Windows? - 那里的答案似乎表明这是不可能的,这是有道理的,因为它可能特定于正在使用的鼠标硬件/驱动程序。

就设置光标位置而言 - 如果您使用像 SetCursorPos() 这样的函数,并且正在使用 WM_MOUSEMOVE 消息,那么您正在使用的坐标是绝对的,而不是相对的,并且不应该依赖于鼠标的dpi。

【讨论】:

  • 嗨,Michael,谢谢您的回答我还阅读了之前提出的问题,该问题是 2011 年提出的,所以我希望现在可以提供解决方案。 :) 我不能使用 SetCursorPos(),我必须使用带有相对鼠标移动的 SendInput。
  • 你能提供更多关于你试图用这个做什么的信息吗?即使使用 SendInput 的相对鼠标移动,我也看不出这会受到鼠标硬件 dpi 的影响..
  • 在第三人称射击游戏中,我想将鼠标相对移动发送到当前注视位置(注视位置 = 您注视的屏幕位置。此信息来自我的眼球追踪器)。此鼠标移动受鼠标 dpi 设置的影响。我可以使用 SystemParametersInfo 获取 Windows 鼠标设置中定义的鼠标当前速度,但我不知道如何获取鼠标的 dpi 设置...
  • 您能否事先校准程序以获取鼠标 dpi.. 或在正常移动期间对鼠标移动速率进行采样并使用它来获得 一些 dpi 的概念 - 或至少,dpi 是如何影响运动的?
  • 那是我的后备解决方案。 :) 因为它不是那么准确,感觉有点像黑客。我会试一试。如果我找到解决方案或实现它的方法,我会在这里发布。非常感谢你,迈克尔。
【解决方案2】:
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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2013-01-04
    • 2015-04-03
    • 1970-01-01
    • 2020-01-16
    相关资源
    最近更新 更多