1

我创建了一个 800x600 像素的不可调整大小的 Windows 窗体。我的问题是,当在高度小于我的表单高度的屏幕分辨率上查看表单时,我的对话框的底部被 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 不允许将任何窗口拖动到屏幕顶部边缘之外。它将窗口捕捉回屏幕顶部。

我正在寻找一种禁用此 Windows 行为的方法,至少对于我的表单而言。

4

2 回答 2

0

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

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

于 2012-12-02T16:40:21.673 回答
0

我知道这已经很老了,但是当我为这个问题寻找一个简单的解决方案时,我发现了这个问题。

您不需要计算任何东西,只需保存一个值并再次使用它。

只需将 Forms Y Location 保存在 MouseUp 事件和 ResizeEnd 事件中,将 Forms Y Location 设置为已保存的位置。

int oldY;

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        oldY = this.Location.Y;
        Console.WriteLine("LMB Up");
    }
}

private void Form1_ResizeEnd(object sender, EventArgs e)
{
    this.Location = new Point(this.Location.X, oldY);
    Console.WriteLine("ResizeEnd");
}

希望这可以帮助任何寻找此问题的简单解决方案的人。

于 2021-10-19T17:36:36.770 回答