【问题标题】: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,但有时系统需要更长的睡眠时间。