拖动超出屏幕顶部时禁用Windows捕捉表单

时间:2012-12-02 11:27:11

标签: c# .net windows

我创建了一个800 x600像素的不可调整大小的Windows窗体。我的问题是,当在高度小于表格高度的屏幕分辨率上查看表单时,我的对话框底部会被窗口任务栏覆盖。

我尝试通过允许用户使用以下方法从任何地方拖动表单来解决此问题:

[DllImport("user32.dll")]
        static extern IntPtr DefWindowProc(IntPtr hWnd, uint uMsg, UIntPtr wParam, IntPtr lParam);
        [DllImport("user32.dll")]
        static extern bool ReleaseCapture(IntPtr hwnd);

        const uint WM_SYSCOMMAND = 0x112;
        const uint MOUSE_MOVE = 0xF012;

        public void Drag()
        {
            DefWindowProc(this.Handle, WM_SYSCOMMAND, (UIntPtr)MOUSE_MOVE, IntPtr.Zero);
        }


        private void OnMainPanelMouseDown(object sender, MouseEventArgs e)
        {
            Control ctrl = sender as Control;
            ReleaseCapture(ctrl.Handle);

            this.Drag(); // put the form into drag mode.
        }

我能够将表单拖到任何地方,但现在我遇到了问题。 Windows不允许将任何窗口拖动到屏幕的上边缘之外。它将窗口按回到屏幕顶部。

我正在寻找一种方法来禁用此窗口行为,至少对于我的表单。

1 个答案:

答案 0 :(得分:0)

我能够用一个小技巧解决这个问题。主要是处理ResizeEnd事件并跟踪MouseDown事件和ResizeEnd事件之间的鼠标指针位置。然后将差异添加到/从初始表单的Y坐标中减去,该坐标保存在MouseDown事件中,然后只是将表单的位置设置为该坐标。

如果有人可以提供不同的答案,我仍然愿意接受其他答案,因为这会导致某种闪烁,因为Windows捕捉表单和代码强制其位置之间存在位置差异。