如何使用SendInput自动执行Drag& Drop

时间:2014-04-19 20:32:23

标签: c++ c winapi automation sendinput

我想测试在浏览器上运行的Flash应用程序。我需要在应用程序中拖动碎片。我想通过使用windows api模拟鼠标移动来做到这一点。

这是我模拟鼠标拖动的导航解决方案:

            void MoveMouse(LPINPUT input, int x, int y) {
                input->type = INPUT_MOUSE;
                input->mi.dx = x*(65536/GetSystemMetrics(SM_CXSCREEN));
                input->mi.dy = y*(65536/GetSystemMetrics(SM_CYSCREEN));
                input->mi.dwFlags =  MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
            }

            void LeftDownMouse(LPINPUT input, int x, int y) {
                input->type = INPUT_MOUSE;
                input->mi.dx = x*(65536/GetSystemMetrics(SM_CXSCREEN));
                input->mi.dy = y*(65536/GetSystemMetrics(SM_CYSCREEN));
                input->mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
            }

            void LeftUpMouse(LPINPUT input, int x, int y) {
                input->type = INPUT_MOUSE;
                input->mi.dx = x*(65536/GetSystemMetrics(SM_CXSCREEN));
                input->mi.dy = y*(65536/GetSystemMetrics(SM_CYSCREEN));
                input->mi.dwFlags = MOUSEEVENTF_LEFTUP;
            }

            void DragMouse(LPINPUT inputs, int startX, int startY, int dropX, int dropY) {
                MoveMouse(&inputs[0], startX, startY);
                LeftDownMouse(&inputs[1], startX, startY);
                LeftUpMouse(&inputs[2], startX, startY);
                LeftDownMouse(&inputs[3], startX, startY);
                MoveMouse(&inputs[4], dropX, dropY);
                LeftUpMouse(&inputs[5], dropX, dropY);
            }

            int _tmain(int argc, _TCHAR* argv[])
            {
                INPUT inputs [6] = {};
                                    // Assume there is a maximized window, mouse drags the window from 40, 10 to 100,100 coordinates.
                DragMouse(inputs, 40, 10, 100, 100);

                SendInput(6, inputs, sizeof(INPUT));


                Sleep(1000);

                return 0;
            }

这段代码大多不起作用,有时可行,但它有不确定的行为。可能是什么问题呢?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我遇到了类似的拖放问题,虽然我的结果是一致的,鼠标移动但不是被拖动的项目。

您的MoveMouse函数缺少MOUSEEVENTF_LEFTDOWN标记。试试input->mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN;

如果没有标记设置,您只需要在不按下鼠标左键的情况下移动鼠标。

修改

我刚刚检查了我的实现,并且在按下或释放鼠标按钮时没有设置坐标。只有在搬家时。

对于结果的差异,您可以在设置字段之前将INPUT清零来停止这些。