C# 移动无边界窗体会产生奇怪的副作用
我对C#还相当陌生。 为了得到一个现代的设计应用,我决定使我的表格无边界。然后,我找到了一个代码片段,可以移动我的无边界表单,效果非常好C# 移动无边界窗体会产生奇怪的副作用,c#,borderless,C#,Borderless,我对C#还相当陌生。 为了得到一个现代的设计应用,我决定使我的表格无边界。然后,我找到了一个代码片段,可以移动我的无边界表单,效果非常好 private const int WM_NCHITTEST = 0x84; private const int HT_CAPTION = 0x2; protected override void WndProc(ref Message m) { base.WndProc(ref m); switch (m.Msg) { ca
private const int WM_NCHITTEST = 0x84;
private const int HT_CAPTION = 0x2;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg) {
case WM_NCHITTEST:
m.Result = (IntPtr)(HT_CAPTION);
break;
}
}
我还需要获取表单maximize事件,并找到另一个代码段,它同样可以完美地工作。至少如果我独立使用它们
case WM_SYSCOMMAND:
if (IsMaximized == false)
{
IsMaximized = true;
Btn_Ribbon_MaximizeMinimize.Image = Properties.Resources.Img_MinimizeForm;
this.WindowState = FormWindowState.Maximized;
}
else if (IsMaximized == true)
{
IsMaximized = false;
Btn_Ribbon_MaximizeMinimize.Image = Properties.Resources.Img_MaximizeForm;
this.WindowState = FormWindowState.Normal;
}
break;
现在奇怪的部分来了。如果我同时使用它们
#region Move borderless Form
private const int WM_NCHITTEST = 0x84;
private const int HT_CLIENT = 0x1;
private const int HT_CAPTION = 0x2;
private const int WM_SYSCOMMAND = 0x0112;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg) {
case WM_NCHITTEST:
m.Result = (IntPtr)(HT_CAPTION);
break;
case WM_SYSCOMMAND:
if (IsMaximized == false)
{
IsMaximized = true;
Btn_Ribbon_MaximizeMinimize.Image = Properties.Resources.Img_MinimizeForm;
this.WindowState = FormWindowState.Maximized;
}
else if (IsMaximized == true)
{
IsMaximized = false;
Btn_Ribbon_MaximizeMinimize.Image = Properties.Resources.Img_MaximizeForm;
this.WindowState = FormWindowState.Normal;
}
break;
}
}
#endregion
…我有各种奇怪的副作用:
- 只需单击我的表单就足以使其最大化
- 最小化应用程序后,再次单击windows任务栏中的图标不会使其正常化,而是使其最大化
我如何才能消除这些副作用,或者甚至比解决方法更好,有没有更好的方法来实现这一点?WM\U SYSCOMMAND消息可以包含的信息不仅仅是最大化事件。当您处理
WM\u NCHITTEST
并告诉操作系统已单击标题栏时,当您释放鼠标按钮时,还会导致WM\u SYSCOMMAND
您应该检查m.WParam
值以确定执行了什么操作
提到SC\u MAXIMIZE(0xF030),但在我的机器上,该值实际上是SC\u MAXIMIZE2(0xF032)。我找不到任何关于该值的文档,但也提到了它。消息
WM\u SYSCOMMAND
包含的信息不仅仅是最大化事件。当您处理WM\u NCHITTEST
并告诉操作系统已单击标题栏时,当您释放鼠标按钮时,还会导致WM\u SYSCOMMAND
您应该检查m.WParam
值以确定执行了什么操作
提到SC\u MAXIMIZE(0xF030),但在我的机器上,该值实际上是SC\u MAXIMIZE2(0xF032)。我找不到任何关于该值的文档,但也提到了它。@duDE不,当然不是。我不想让我的无边界表单可移动,因为它已经按预期工作了。我想除掉由它引起的虫子。@哥们,不,当然不是。我不想让我的无边界表单可移动,因为它已经按预期工作了。我想除掉它引起的虫子。