【问题标题】:Simulating drag with SendInput C++使用 SendInput C++ 模拟拖动
【发布时间】:2021-03-02 18:51:56
【问题描述】:

有谁知道如何在 C++ 中使用 SendInput 模拟鼠标拖动?我想以编程方式移动桌面上的图标。我希望序列(将鼠标移至 A)->(按下左键)->(将鼠标移至 B)->(释放左键)会起作用,但事实并非如此。鼠标移动到 A,然后移动到 B,但图标没有移动。 我认为 Drag'n'Drop (SHDoDragDrop()) 不适合此任务 - 它需要 IDataObject 和 IDropSource 才能工作。 感谢任何提示或想法。

【问题讨论】:

  • 请显示您尝试但不适合您的实际代码。或者,桌面是List View,因此您可以使用ListView_HitTest()ListView_SetItemPositiion/32() 而根本不用操作鼠标。

标签: c++ simulation drag sendinput


【解决方案1】:

抱歉,这不是答案 - 只是我试图实现目标的代码 sn-p。目标可能通过不同的方式实现,但我对这个特定的方式很感兴趣。

INPUT inputs[4] = { 0 };

inputs[0].type = INPUT_MOUSE;
inputs[0].mi.dx = (from.x * 65535) / screen_w; inputs[0].mi.dy = (from.y * 65535) / screen_h;
inputs[0].mi.mouseData = 0; inputs[0].mi.time = 0;
inputs[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;

inputs[1].type = INPUT_MOUSE;
inputs[1].mi.dx = (from.x * 65535) / screen_w; inputs[1].mi.dy = (from.y * 65535) / screen_h;
inputs[1].mi.mouseData = 0; inputs[1].mi.time = 0;
inputs[1].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN;

inputs[2].type = INPUT_MOUSE;
inputs[2].mi.dx = (to.x * 65535) / screen_w; inputs[2].mi.dy = (to.y * 65535) / screen_h;
inputs[2].mi.mouseData = 0; inputs[2].mi.time = 0;
inputs[2].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;

inputs[3].type = INPUT_MOUSE;
inputs[3].mi.dx = (to.x * 65535) / screen_w; inputs[3].mi.dy = (to.y * 65535) / screen_h;
inputs[3].mi.mouseData = 0; inputs[3].mi.time = 0;
inputs[3].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP;

UINT uSent = SendInput(4, inputs, sizeof(INPUT));

【讨论】:

    【解决方案2】:

    答案很简单——SendInput() 应该为每个动作一个一个地调用。此外,在每次调用之后,可能需要在短时间内添加 Sleep()。通常工作参数为 10,但有时系统需要更长的睡眠时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-15
      • 2011-06-05
      • 2012-05-09
      • 1970-01-01
      • 2018-11-02
      • 2020-11-07
      • 1970-01-01
      • 2013-07-20
      相关资源
      最近更新 更多