1

我想测试在浏览器上运行的 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;
            }

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

4

1 回答 1

0

我在拖放时遇到了类似的问题,尽管我的结果是一致的,因为鼠标在移动,但不是被拖动的项目。

您的MoveMouse功能缺少MOUSEEVENTF_LEFTDOWN标志。尝试input->mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN;

如果没有标志设置,您只是要求鼠标在没有按下鼠标左键的情况下移动。

编辑

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

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

于 2015-07-16T08:31:56.867 回答