win32模拟鼠标拖拽

问题遇到的现象和发生背景

在一个模态窗口,想要在本窗口中,通过调用win32,来使另一个窗口的控件进行移动(本身可以通过鼠标中键按下,移动,控件可以拖动)

问题相关代码,请勿粘贴截图
    private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.MiddleButton != MouseButtonState.Pressed) return;

        const int WM_MBUTTONDOWN = 0x0207;

        IntPtr last = PmSoft.Common.Controls.RevitMethod.RevitHandle.RevitViewHandle;

        POINT mp = new POINT(0, 0);
        bool isGet = GetCursorPos(out mp);
        if (isGet)
        {
            int xPosition = mp.X;
            int yPosition = mp.Y << 16;
            SendMessage(last, WM_MBUTTONDOWN, (IntPtr)(0x00000010), (IntPtr)(xPosition + yPosition));
            e.Handled = true;
        }          
    }


    private void Window_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.MiddleButton != MouseButtonState.Pressed) return;

        const int WM_MOUSEMOVE = 0x0200;
        IntPtr last = PmSoft.Common.Controls.RevitMethod.RevitHandle.RevitViewHandle;

        POINT mp = new POINT(0, 0);
        bool isGet = GetCursorPos(out mp);
        if (isGet)
        {
            int xPosition = mp.X;
            int yPosition = mp.Y << 16;

            SendMessage(last, WM_MOUSEMOVE, (IntPtr)(0x00000010), (IntPtr)(xPosition + yPosition));
        }
    }


    private void Window_MouseUp(object sender, MouseButtonEventArgs e)
    {
        if (e.MiddleButton == MouseButtonState.Pressed) return;

        const int WM_MBUTTONUP = 0x0208;

        IntPtr last = PmSoft.Common.Controls.RevitMethod.RevitHandle.RevitViewHandle;

        POINT mp = new POINT(0, 0);
        bool isGet = GetCursorPos(out mp);
        if (isGet)
        {
            int xPosition = mp.X;
            int yPosition = mp.Y << 16;
            //PmSoft.Common.CommonClass.Win32Helper.Win32.SetCapture(last);
            SendMessage(last, WM_MBUTTONUP, (IntPtr)(0x00000000), (IntPtr)(xPosition + yPosition));
            e.Handled = true;
        }
    }
运行结果及报错内容

发送了鼠标中键按下,移动,和中键抬起事件,但是没有效果,不知道哪里出问题了。
对win32不太熟悉,请大家帮忙看看。

我的解答思路和尝试过的方法
我想要达到的结果

一般是 API 函数的参数没处理好。
然后按下和移动、抬起之间要加 5ms 的延迟。
这里有写好的代码,你参考下

        [DllImport("user32.dll", EntryPoint = "mouse_event", SetLastError = true)]
        public static extern void Mouse_event(EMouse dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
    /// <summary>
    /// 鼠标操作 dwFlags 〖Windows API〗
    /// <para>表示鼠标的按下和抬起</para>
    /// <para>参见 <see cref="API_窗口.Mouse_event(EMouse, int, int, int, int)"/></para>
    /// </summary>
    public enum EMouse {
        /// <summary>移动鼠标(相对位置)</summary>
        MOVE = 0x1,
        /// <summary>模拟鼠标左键按下</summary>
        LEFTDOWN = 0x2,
        /// <summary>模拟鼠标左键抬起</summary>
        LEFTUP = 0x4,
        /// <summary>模拟鼠标右键按下</summary>
        RIGHTDOWN = 0x8,
        /// <summary>模拟鼠标右键抬起</summary>
        RIGHTUP = 0x10,
        /// <summary>模拟鼠标中键按下</summary>
        MIDDLEDOWN = 0x20,
        /// <summary>模拟鼠标中键抬起</summary>
        MIDDLEUP = 0x40,
        /// <summary>模拟鼠标滚轮</summary>
        WHEEL = 0x800,
        /// <summary>表明参数dX,dy含有规范化的绝对坐标。</summary>
        ABSOLUTE = 0x8000,
        /// <summary>移动鼠标到绝对位置</summary>
        MOVETO = ABSOLUTE | MOVE
    }
    /// <summary>
    /// 鼠标操作 dwFlags 〖Windows API〗
    /// <para>表示鼠标的按下和抬起</para>
    /// <para>参见 <see cref="API_窗口.Mouse_event(EMouse, int, int, int, int)"/></para>
    /// </summary>

 #region ◢  Mouse_event  ◣
        /// <summary>设置并移动鼠标位置为相对当前位置的 X, Y 。</summary>
        public static void 偏移(int x, int y) { API_窗口.Mouse_event(EMouse.MOVE, x, y, 0, 0); }
        /// <summary>通过 mouse_event 移动鼠标位置到 X, Y 。<para>有可能无效,请使用 <see cref="设置位置(int, int)"/> 函数代替。</para></summary>
        public static void 移至(int x, int y) { API_窗口.Mouse_event(EMouse.MOVETO, x, y, 0, 0); }
        /// <summary>按下鼠标左键 。</summary>
        public static void 按下左键(int x, int y) { API_窗口.Mouse_event(EMouse.LEFTDOWN, x, y, 0, 0); }
        /// <summary>抬起鼠标左键 。</summary>
        public static void 抬起左键(int x, int y) { API_窗口.Mouse_event(EMouse.LEFTUP, x, y, 0, 0); }
        /// <summary>按下鼠标右键 。</summary>
        public static void 按下右键(int x, int y) { API_窗口.Mouse_event(EMouse.RIGHTDOWN, x, y, 0, 0); }
        /// <summary>抬起鼠标右键 。</summary>
        public static void 抬起右键(int x, int y) { API_窗口.Mouse_event(EMouse.RIGHTUP, x, y, 0, 0); }
        /// <summary>按下鼠标中键 。</summary>
        public static void 按下中键(int x, int y) { API_窗口.Mouse_event(EMouse.MIDDLEDOWN, x, y, 0, 0); }
        /// <summary>抬起鼠标中键 。</summary>
        public static void 抬起中键(int x, int y) { API_窗口.Mouse_event(EMouse.MIDDLEUP, x, y, 0, 0); }
        /// <summary>距离: 正数表示向上滚动,负值表示向下滚动。
        /// <para></para>轮击定义为 WHEEL_DELTA ,即 120 。</summary>      
        public static void 滚动(int x, int y, int 距离) { API_窗口.Mouse_event(EMouse.WHEEL, x, y, 距离, 0); }
        /// <summary>利用 PostMessage 发送鼠标按下和抬起消息 给指定句柄的窗体</summary>
        public static void 发点击信号(IntPtr 句柄, int X, int Y, int 按键时长 = 20) {
            设置位置(X, Y);
            API_窗口.PostMessage(句柄, (int)EwMsg.WM_LBUTTONDOWN, 0, X + Y * 65536);
            if (按键时长 > 0) { Thread.Sleep(按键时长); }
            API_窗口.PostMessage(句柄, (int)EwMsg.WM_LBUTTONUP, 0, X + Y * 65536);
        }
        #endregion