加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 20:58:30 所属栏目:百科 来源:网络整理
导读:请让我详细说明我在做什么. 我正在创建一个屏幕共享应用程序.其中有2个应用程序首先是Windows应用程序(其屏幕正在共享),另一个是浏览器Web应用程序(用户正在其上观看屏幕).浏览器Web应用程序将鼠标的客户端x和y坐标发送到Windows应用程序. Windows应用程序使
请让我详细说明我在做什么.

我正在创建一个屏幕共享应用程序.其中有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 Information: 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中常见的监视器设置).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读