【问题标题】:INPUT_MOUSE: mouse does not move with given dx/dy valuesINPUT_MOUSE:鼠标在给定的 dx/dy 值下不移动
【发布时间】:2012-03-30 16:26:45
【问题描述】:

我正在使用 INPUT 移动鼠标来设置光标位置。这很好,除了我不能使用屏幕值来移动光标。如果我想将光标从 0 设置为 1680,我必须使用 1680*0.66 作为 dx 值来获得正确的位置(游戏内或桌面上)。

(我使用mousemove,因为我在游戏中设置光标位置,绝对定位在那里不起作用。我有两个屏幕,一个是1680宽,另一个是1280)

知道为什么我必须使用这个因素或它来自哪里吗?谢谢。

#define MOUSE_MOVE_FACTOR 0.6619

        //Set mouse pos:
        void setMousePos(int iX, int iY){


            iX = (int)((double)iX*MOUSE_MOVE_FACTOR);
            iY = (int)((double)iY*MOUSE_MOVE_FACTOR);


            INPUT *buffer = new INPUT[1];

            buffer->type = INPUT_MOUSE;
            buffer->mi.dx = iX;
            buffer->mi.dy = iY;
            buffer->mi.mouseData = 0;
            buffer->mi.dwFlags = MOUSEEVENTF_MOVE;
            buffer->mi.time = 0;
            buffer->mi.dwExtraInfo = 0;

            SendInput(1,buffer,sizeof(INPUT));

            Sleep(100 + (rand() % 50));

        }

【问题讨论】:

  • 我可以说“内存泄漏”吗?
  • 你怎么知道你必须使用这个因素?你刚才是不是想出了一个随机数?
  • 游戏经常改变视频模式。
  • 我只是尝试在我的桌面上将鼠标设置为 1680 并得出了这个因素。

标签: c++ mousemove


【解决方案1】:

可能与鼠标加速有关。禁用它会导致鼠标位置不同。

【讨论】:

    【解决方案2】:

    内存泄漏可能会对您的应用程序造成奇怪的影响,这可能会产生影响。

    每次在buffer 的第二次分配调用此函数时,都会导致内存泄漏

    buffer = new INPUT[1];

    【讨论】:

      【解决方案3】:

      根据MOUSEINPUT 上的文档,如果 dwFlags 中未设置 MOUSEEVENTF_ABSOLUTE,则 dx/dy 是相对坐标。试试:

       buffer->mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
      

      看看这是否有效。请注意,如文档所述,您必须将 X/Y 转换为从 0-65535 的标准化绝对坐标。

      我还会质疑您为什么首先将位置设置为 (-3000,-3000)。我还猜想您不需要 MOUSE_MOVE_FACTOR 的魔法因子,这可能是由于混合了相对/绝对鼠标坐标。

      编辑:重新阅读您的问题,我错过了您可能故意使用相对鼠标位置。我猜您的绝对定位可能由于未使用归一化绝对坐标而失败(如果不阅读整个文档,我自己也不会猜到)。另请注意 1680x0.66=1109 可疑地接近 1024,我可能猜测游戏以 1024x 运行?分辨率。

      【讨论】:

      • 是的,绝对定位在这里不起作用,因为游戏只是寻找动作。游戏也在 1680x1050 下运行。但是,无论我是在游戏中还是在桌面上,都没有区别。
      • 嗯,那很奇怪。根据文档,位置应该以像素为单位,我想不出任何会引入像这样的常量因素的东西。
      【解决方案4】:

      我知道这是旧的,但仅适用于其他任何人。 MOUSEINPUTmouse_event 的文档解释说,绝对定位被规范化为 0-65535 范围。

      如果指定了 MOUSEEVENTF_ABSOLUTE 值,则 dx 和 dy 包含 0 到 65,535 之间的归一化绝对坐标。事件 过程将这些坐标映射到显示表面上。协调 (0,0) 映射到显示表面的左上角; 坐标 (65535,65535) 映射到右下角。在一个 多显示器系统,坐标映射到主显示器。

      所以转换将是 x / (w-1) * 65535 和 y / (h-1) * 65535。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多