你如何防止窗户被移动?

时间:2009-05-25 19:41:22

标签: c# .net winforms user-interface

我如何停止移动表单?我将表单边框样式设置为FixedSingle并且希望保持这种方式,因为它在vista中看起来很好:)

15 个答案:

答案 0 :(得分:67)

看看这个link。您可能对选项#3感兴趣。它将要求您包装一些本机代码,但应该工作。链接底部还有一条评论,显示了一种更简单的方法。取自评论(不能归功于它,但我会为你节省一些搜索):

protected override void WndProc(ref Message message)
{
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MOVE = 0xF010;

    switch(message.Msg)
    {
        case WM_SYSCOMMAND:
           int command = message.WParam.ToInt32() & 0xfff0;
           if (command == SC_MOVE)
              return;
           break;
    }

    base.WndProc(ref message);
}

答案 1 :(得分:25)

您可以将表单的FormBorderStyle属性设置为无

this.FormBorderStyle=System.Windows.Forms.FormBorderStyle.None

答案 2 :(得分:8)

我发现这可以阻止表单移动(在c#中)

protected override void WndProc(ref Message m)
        {
            const int WM_SYSCOMMAND = 0x0112;
            const int SC_MOVE = 0xF010;

            switch (m.Msg)
            {
                case WM_SYSCOMMAND:
                    int command = m.WParam.ToInt32() & 0xfff0;
                    if (command == SC_MOVE)
                        return;
                    break;
            }
            base.WndProc(ref m);
        }

Found here

答案 3 :(得分:2)

这并不是全部(当您尝试移动表单时会有一些闪烁),但您可以使用LocationChanged属性将表单保留在您想要的位置:

private Point _desiredLocation;
// assign the _desiredLocation variable with the form location at some
// point in the code where you know that the form is in the "correct" position


private void Form_LocationChanged(object sender, EventArgs e)
{
    if (this.Location != _desiredLocation)
    {
        this.Location = _desiredLocation;
    }
}

出于好奇;你为什么要这样做?

答案 4 :(得分:2)

在Windows中,WS_CAPTION样式是允许使用鼠标移动窗口的非客户端区域。因此,最简单的方法就是从窗口中删除此样式。

但是,如果你需要有一个标题但仍能达到你想要的效果,那么下一个风格就是捕获WM_NCHITTEST消息并检查HTCAPTION。如果代码是HTCAPTION,则返回NTNOWHERE。这将阻止默认窗口过程执行默认移动窗口事务。

答案 5 :(得分:2)

让表单不可移动不是一个好习惯。如果我是你,我会想到它 无论如何,您可以通过覆盖WinProc来禁用系统菜单中的[Move]菜单项来完成此操作。

[DllImport("user32.dll")]
private static extern Int32 EnableMenuItem ( System.IntPtr hMenu , Int32uIDEnableItem, Int32 uEnable);  
private const Int32 HTCAPTION = 0×00000002;  
private const Int32 MF_BYCOMMAND =0×00000000;  
private const Int32 MF_ENABLED =0×00000000;  
private const Int32 MF_GRAYED =0×00000001;  
private const Int32 MF_DISABLED =0×00000002; 
private const Int32 SC_MOVE = 0xF010; 
private const Int32 WM_NCLBUTTONDOWN = 0xA1;
private const Int32 WM_SYSCOMMAND = 0×112;
private const Int32 WM_INITMENUPOPUP = 0×117;

protected override void WndProc(ref System.Windows.Forms.Message m )
{
if (m.Msg == WM_INITMENUPOPUP)
{
    //handles popup of system menu
    if ((m.LParam.ToInt32() / 65536) != 0) // 'divide by 65536 to get hiword
    {
        Int32 AbleFlags = MF_ENABLED;
        if (!Moveable)
        {
            AbleFlags = MF_DISABLED | MF_GRAYED; // disable the move
        }
        EnableMenuItem(m.WParam, SC_MOVE, MF_BYCOMMAND | AbleFlags);
    }
}
if (!Moveable)
{
    if (m.Msg == WM_NCLBUTTONDOWN) //cancels the drag this is IMP
    {
        if (m.WParam.ToInt32() == HTCAPTION) return;
    }
    if (m.Msg == WM_SYSCOMMAND) // Cancels any clicks on move menu
    {
        if ((m.WParam.ToInt32() & 0xFFF0) == SC_MOVE) return;
    }
}
base.WndProc(ref m);
}  

此外,您还可以处理表单的OnMove事件。但我认为这会导致一些闪烁:

private void Form1_Move(object sender, EventArgs e)
{
    this.Location = defaultLocation;
}

答案 6 :(得分:2)

尝试覆盖WndProc:

protected override void WndProc(ref Message m)
{
   const int WM_NCLBUTTONDOWN = 161;
   const int WM_SYSCOMMAND = 274;
   const int HTCAPTION = 2;
   const int SC_MOVE = 61456;

   if ((m.Msg == WM_SYSCOMMAND) && (m.WParam.ToInt32() == SC_MOVE))
   {
       return;
   }

   if ((m.Msg == WM_NCLBUTTONDOWN) && (m.WParam.ToInt32() == HTCAPTION))
   {
       return;
   }

   base.WndProc(ref m);
}

答案 7 :(得分:2)

  1. 转到表格活动 - >位置已更改
  2. 编写以下代码

    Location = new Point(this.Width,this.Height);
    

答案 8 :(得分:1)

只需将FormBorderStyle属性更改为None

答案 9 :(得分:0)

我会质疑你需要让表格不可移动。这听起来不太好。您当然可以在窗口关闭时保存窗口的位置,然后将窗口重新打开到该位置。这使用户可以控制窗口的位置。

答案 10 :(得分:0)

您可以尝试:

this.Locked = true;

答案 11 :(得分:0)

您可以订阅Form.Move事件并从中重新定位。

答案 12 :(得分:0)

只需将formlocation_changed事件上的位置重置为它所在的位置即将Form.Location设置为变量,然后移动它,当用户尝试移动它时,它将返回到您设置它的变量位置。

答案 13 :(得分:0)

将Form属性StartPostion更改为Manual。 然后,处理LocationChanged事件:

private void frmMain_LocationChanged(object sender, EventArgs e)
{
Location = new Point(0, 0);
}

答案 14 :(得分:0)

Private Sub MyFormLock()         Me.Location =新点(0,0)     结束子

Private Sub SearchSDR_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
    Call MyFormLock()
End Sub