C#: 如何禁用窗体移动?

5

MSV-Studio中对“Locked”的描述是:“Locked属性确定是否可以移动或调整控件”,因此我将winforms中的Locked属性设置为true,但是窗体仍然可以移动。

防止窗体移动的正确方法是什么?


在鼠标事件中重置位置? - Holystream
@Eric - 将WindowState设置为Maximized,无论Locked设置为true还是false,都能完全满足需求。如果您将此评论移至答案中,我会将其标记为已接受。 - jacknad
可能是仅垂直移动窗体的重复问题。 - Hans Passant
Locked属性只在设计器中有效。请根据重复问题中的答案进行调整。 - Hans Passant
@Hans。这个问题比“仅垂直移动表单”更简单,答案也更简单。 - jacknad
答案不仅仅是为你而存在的。 - Hans Passant
4个回答

6

最大化它。谢谢,JackN. ;-)


3
我使用以下代码来显示内部编写的企业安全应用程序的表单对话框窗口 - 其中一个要求是该表单不能被移动、调整大小或生活在任何其他表单下面。无论如何,下面是一个开始...
/// <seealso href="http://msdn.microsoft.com/en-us/library/ms633548(v=vs.85).aspx"/>
    /// <seealso href="http://msdn.microsoft.com/en-us/library/ms633545(v=vs.85).aspx"/>
    public class ShowMessage
    {
        const int SW_SHOWMAXIMIZED = 3; //for maximising (if desired)
        const int SW_SHOW = 5; //for simply activating the form (not needed)
        const int SW_SHOWNORMAL = 1; //displays form at original size and position (what we use here)

        const UInt32 SWP_NOSIZE = 0x0001; //cannot be resized
        const UInt32 SWP_NOMOVE = 0x0002; //cannot be moved

        static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); //always lives at the top
        const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE; //sets the flags for no resize / no move

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
        [DllImport("user32.dll")]
        static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

        /// <summary>
        /// Displays the passed form using the parameters set in the base ShowMessage class
        /// </summary>
        /// <param name="frm">A Windows Form object</param>
        /// <example><code>ShowMessage.ShowTopmost(new myForm());</code></example>
        public static void ShowTopmost(Form frm)
        {
            ShowWindow(frm.Handle, SW_SHOWNORMAL); //shows the form
            SetWindowPos(frm.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); //sets the form position as topmost, centered

        }
    }

然后我只需调用该函数。
ShowMessage.ShowTopmost(new frmMessage());

我不是说这是唯一的方法或正确的方法,但这是一种做法。


按照上述说明操作。复制该类,然后使用公共的“ShowTopmost”方法进行调用。 - dotalchemy
所以,我应该首先在Visual Studio中打开一个Windows应用程序,然后将这段代码粘贴到form1.cs中? - sqlchild
是的,请确保您正在引用 System.Runtime.InteropServices,并确保您正在传递一个您已创建的表单作为消息。 - dotalchemy
先生,当我把最后一行 ShowMessage.ShowTopmost(new Form1()); 粘贴到您的代码中时,在哪里应该粘贴?如果我将其粘贴到 ShowTopmost() 方法中,则无法正常工作。 - sqlchild
将其放在按钮的_OnClick处理程序中或其他任何处理程序中。那只是你调用它的方式。 - dotalchemy
先生,我已经做了,但是表单仍然可以被鼠标光标移动? - sqlchild

1

一般来说,阻止用户移动窗口是不好的做法。用户应该能够将窗口放在任何他想要的地方。防止调整大小是一回事,防止移动是另一回事。我不知道有没有C#本地的方法可以做到这一点,但你可能可以钩入Win32来防止窗口移动。


这是一个关于Windows CE 5.0平板电脑的客户需求。 - jacknad
你不需要任何钩子。 - jay_t55
@baeltazor 你能详细说明一下吗?如何防止用户移动非最大化的窗口? - McKay

0

你可以尝试使用窗体的Move事件,并将窗体设置回起始位置。你需要捕获并存储(在内存中)起始位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接