Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 移动无边界窗体会产生奇怪的副作用_C#_Borderless - Fatal编程技术网

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

我对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) {
        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不,当然不是。我不想让我的无边界表单可移动,因为它已经按预期工作了。我想除掉由它引起的虫子。@哥们,不,当然不是。我不想让我的无边界表单可移动,因为它已经按预期工作了。我想除掉它引起的虫子。