C#:从代码后面拖动任何窗口(以编程方式)

时间:2016-02-18 08:50:56

标签: c# wpf winforms

请让我详细说明我在做什么。

我正在创建一个屏幕共享应用程序。其中有2个应用程序首先是Windows应用程序(其屏幕正在共享),另一个是浏览器Web应用程序(用户正在其上观看屏幕)。浏览器Web应用程序将鼠标的客户端xy坐标发送到Windows应用程序。 Windows应用程序使用xy坐标使用下面给出的代码移动鼠标。

        [DllImport("user32.dll")]
        static extern bool SetCursorPos(int X, int Y);

        public static void MoveCursorToPoint(int x, int y)
        {
            SetCursorPos(x, y);
        }

浏览器应用程序也发送鼠标点击,Windows应用程序正在使用下面给出的代码执行点击。

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);

        private const int MOUSEEVENTF_LEFTDOWN = 0x02;
        private const int MOUSEEVENTF_LEFTUP = 0x04;
        private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
        private const int MOUSEEVENTF_RIGHTUP = 0x10;

        public static void DoMouseClick()
        {
            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
        }

问题/挑战

这里的问题或挑战是执行拖动操作。例如,如何将任何应用程序的窗口从C#代码从一个位置拖动到另一个位置。

非常感谢你的关注。

1 个答案:

答案 0 :(得分:0)

最后,这是将执行所有系统鼠标事件的代码。为了执行拖放操作,您需要首先发送MouseDown(鼠标单击)并保持单击时更改鼠标位置而不是发送鼠标单击(释放单击)这样的内容。

  MouseHelper mh = new MouseHelper();
            mh.sendMouseDown();
            Cursor.Position = new Point(30, 30);
            mh.sendMouseUp();

这是整个帮助文件

    public class MouseHelper
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        //public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
        public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

        private const uint MOUSEEVENTF_LEFTDOWN = 0x02;
        private const uint MOUSEEVENTF_LEFTUP = 0x04;
        private const uint MOUSEEVENTF_RIGHTDOWN = 0x08;
        private const uint MOUSEEVENTF_RIGHTUP = 0x10;

        public void sendMouseRightclick(Point p)
        {
            mouse_event((uint)MOUSEEVENTF_RIGHTDOWN | (uint)MOUSEEVENTF_RIGHTUP, (uint)p.X, (uint)p.Y, (uint)0, (uint)0);
        }

        public void sendMouseDoubleClick(Point p)
        {
            mouse_event((uint)MOUSEEVENTF_LEFTDOWN | (uint)MOUSEEVENTF_LEFTUP, (uint)p.X, (uint)p.Y, (uint)0, (uint)0);

            Thread.Sleep(150);

            mouse_event((uint)MOUSEEVENTF_LEFTDOWN | (uint)MOUSEEVENTF_LEFTUP, (uint)p.X, (uint)p.Y, 0, 0);
        }

        public void sendMouseRightDoubleClick(Point p)
        {
            mouse_event((uint)MOUSEEVENTF_RIGHTDOWN | (uint)MOUSEEVENTF_RIGHTUP, (uint)p.X, (uint)p.Y, 0, 0);

            Thread.Sleep(150);

            mouse_event((uint)MOUSEEVENTF_RIGHTDOWN | (uint)MOUSEEVENTF_RIGHTUP, (uint)p.X, (uint)p.Y, 0, 0);
        }

        public void sendMouseDown()
        {
            mouse_event(MOUSEEVENTF_LEFTDOWN, 50, 50, 0, 0);
        }

        public void sendMouseUp()
        {
            mouse_event(MOUSEEVENTF_LEFTUP, 50, 50, 0, 0);
        }
    }

Source此源链接中的给定代码将显示错误

  

附加信息:调用PInvoke函数' KinectHandTrackmyApping!myApp.MainWindow :: mouse_event'堆栈不平衡。这很可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。

为了解决我已经改变的错误

public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);

到此

public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

错误是 long 的使用,因为long是一个例外,因为它是64位的,因为它是32位的,所以它起作用了 - 但是它赢得了#3;用于负坐标(这是Windows中常见的监视器设置)。