【问题标题】:C#: Drag any window from code behind (programmatically)C#:从后面的代码中拖动任何窗口(以编程方式)
【发布时间】:2016-05-30 08:06:48
【问题描述】:

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

我正在创建一个屏幕共享应用程序。其中有 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# 代码从一个地方拖到另一个地方。

非常感谢您的关注。

【问题讨论】:

    标签: c# wpf winforms


    【解决方案1】:

    最后,这是执行所有系统鼠标事件的代码。为了执行拖放操作,您需要先发送 MouseDown(Mouse Click) 并在更改鼠标位置时使其保持单击状态,而不是发送 MouseUp(Release Click) 之类的东西。

      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 位,uint 可以工作,因为它是 32 位 - 但它不适用于负坐标(这是Windows 中的常用监视器设置)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2010-11-10
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      相关资源
      最近更新 更多