你如何防止窗户被移动?

我将如何去停止表单被移动。 我有表单边框样式设置为FixedSingle,并希望保持这种方式,因为它在Vista中看起来不错:)

看看这个链接 。 您可能对选项#3感兴趣。 这将需要你包装一些本地代码,但应该工作。 链接底部还有一条评论,显示了一个更简单的方法。 从评论采取(不能相信它,但我会救你一些search):

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); } 

您可以将窗体的FormBorderStyle属性设置为无

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

我发现这停止移动的forms(它在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); } 

在这里find

  1. 转到表单事件 – >位置已更改

编写下面的代码

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

这不是很漂亮(当您尝试移动窗体时会出现闪烁),但是您可以使用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; } } 

出于好奇; 你为什么想做这个?

在Windows中,WS_CAPTION风格是允许用鼠标移动窗口的非客户端区域。 所以最简单的方法就是从窗口中删除这个样式。

但是,如果您需要有一个标题,并仍然实现你想要的,那么下一个样式将是捕获WM_NCHITTEST消息并检查HTCAPTION。 如果代码是HTCAPTION,则返回NTNOWHERE。 这将阻止默认的窗口过程执行默认的移动窗口的东西。

让你的表单不可移动是不好的做法。 如果我是你的话,我会觉得很奇怪。
无论如何,你可以通过重写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; } 

尝试重写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); } 

我会质疑你需要使表格不可移动。 这听起来不错。 窗户closures时,当然可以保存窗户的位置,然后将窗户重新打开。 这使用户可以控制窗口的位置。

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

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

将表单属性StartPostion更改为手动。 然后,处理LocationChanged事件:

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

Private Sub MyFormLock()Me.Location = New Point(0,0)End Sub

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

你可以试试:

 this.Locked = true; 

只要将窗体边框样式属性更改为None