你如何防止窗户被移动?
我将如何去停止表单被移动。 我有表单边框样式设置为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
- 转到表单事件 – >位置已更改
编写下面的代码
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
。
- string.IsNullOrEmpty(string)与string.IsNullOrWhiteSpace(string)
- 用于.NET的SFTP库
- .NET WCF w3wp本地内存泄漏和加载程序堆中的大小为0的18kdynamic程序集
- 没有MediaTypeFormatter可用于从媒体types为“text / plain”的内容读取“String”types的对象,
- 如何通过拖动扩展窗口框架来移动WPF窗口?
- 如何让WebBrowser控件显示现代内容?
- Parallel.ForEach()与foreach(IEnumerable <T> .AsParallel())
- 如何创build一个带有标签和值的Winformscombobox?
- 把HTML放入Html.ActionLink(),加上没有链接文本?