微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

[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);
        }

问题/挑战

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

非常感谢您的关注.

解决方法

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

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

这是整个帮助文件

public class MouseHelper
    {
        [DllImport("user32.dll",CallingConvention = CallingConvention.StdCall)]
        //public static extern void mouse_event(long dwFlags,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)0);

            Thread.Sleep(150);

            mouse_event((uint)MOUSEEVENTF_LEFTDOWN | (uint)MOUSEEVENTF_LEFTUP,0);
        }

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

            Thread.Sleep(150);

            mouse_event((uint)MOUSEEVENTF_RIGHTDOWN | (uint)MOUSEEVENTF_RIGHTUP,0);
        }

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

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

Source此源链接上的给定代码将给出错误

Additional @R_377_4045@ion: A call to PInvoke function ‘KinectHandTrackmyApping!myApp.MainWindow::mouse_event’ has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

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

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

对此

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

错误是long的使用,因为long是一个例外,因为它是一个64位,因为它是32位的uint有效 – 但它不适用于负坐标(这是Windows中常见的监视器设置).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐