Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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# 你怎样才能得到“的坐标?”;X";窗户上的按钮?_C#_.net_Winforms_Wndproc - Fatal编程技术网

C# 你怎样才能得到“的坐标?”;X";窗户上的按钮?

C# 你怎样才能得到“的坐标?”;X";窗户上的按钮?,c#,.net,winforms,wndproc,C#,.net,Winforms,Wndproc,出于这样或那样的原因,我需要检测用户实际单击X按钮的时间。到目前为止,我得到的是: protected override void WndProc(ref Message m) { if (m.Msg == (int)0xa1) //WM_NCLBUTTONDOWN { Point p = new Point((int)m.LParam); p = this.PointToClient(p);

出于这样或那样的原因,我需要检测用户实际单击X按钮的时间。到目前为止,我得到的是:

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == (int)0xa1) //WM_NCLBUTTONDOWN
        {
            Point p = new Point((int)m.LParam);
            p = this.PointToClient(p);
            if (p.X > 680)
            {
                //do what I need to do...
            }
        }

        base.WndProc(ref m);
    }
基本上,我会留意“WM_nclubuttondown”消息,即鼠标单击窗口的非客户端区域。然后,我从LPRAM获取X和Y坐标,最后将其转换为屏幕坐标。所以在这一点上,我知道用户点击了非客户端区域,我知道表单上的位置


我的问题是,如何判断这些坐标是否在X按钮上。目前,我正在对680进行硬编码,因为在当前的窗口大小下(不太大),这是可行的,但问题是我使用的是Windows 7,它的X按钮比XP大,所以显然硬编码不是可行的选择。此外,我甚至没有为Y坐标编码,所以如果有人单击窗口的右边缘,也会触发该代码。所以有人有什么想法吗?

假设您有“确定”和“取消”按钮,为什么不在单击其中一个按钮时设置一个值呢。然后,在窗体的关闭事件中,如果未设置此值,则表示已单击X按钮。除非有其他我不知道的关闭表单的方法

编辑:


您可以在单击按钮时更改窗体的DialogResult属性,而不是使用全局布尔值。我不确定单击X按钮时对话框结果值是多少,但您必须尝试一下。

假设您有一个“确定”和一个“取消”按钮,为什么不在单击其中一个按钮时设置一个值呢。然后,在窗体的关闭事件中,如果未设置此值,则表示已单击X按钮。除非有其他我不知道的关闭表单的方法

编辑:



您可以在单击按钮时更改窗体的DialogResult属性,而不是使用全局布尔值。我不确定当你点击X按钮时DialogResult的值是多少,你必须试试。

如果你测试的是WM\u NCHITTEST消息,它应该告诉你鼠标何时悬停在关闭按钮上。

如果你测试的是WM\u NCHITTEST消息,它应该告诉你鼠标何时悬停在关闭按钮上。

点击按钮是重要的还是你真的想看看用户是否正确关闭应用程序?为什么要以与其他关闭/退出消息不同的方式处理“x按钮”?我承认这是一种奇怪的情况,但基本上它是一个对话框,关闭时我想触发验证,但标准FormValidating事件不起作用,因为它是一个对话框(别问了,改天再发一篇帖子,我想这是个bug)。因此,我在FormClosing事件中手动处理验证,但我需要知道用户是否刚刚单击了X,在这种情况下,我希望跳过验证。有意义吗?这听起来不是个好主意。有许多方法可以关闭表单,其效果与按close按钮相同,我希望它们都会遇到相同的问题。例如:实例您可以通过按Alt+F4或右键单击标题栏并从结果菜单中选择“关闭窗体”来关闭窗体。我希望Windows 7会添加一个触摸手势来完成同样的操作。单击按钮是否重要,或者您是否真的试图查看用户是否正在关闭应用程序?为什么要处理“x按钮”与其他关闭/退出消息不同?我承认这是一种奇怪的情况,但基本上是一个对话框,关闭时我想触发验证,但标准FormValidating事件不起作用,因为它是一个对话框(不要问,改天再发一篇帖子,我认为这是一个bug)。因此,我在FormClosing事件中手动处理验证,但我需要知道用户是否刚刚单击了X,在这种情况下,我希望跳过验证。有意义吗?这听起来不是个好主意。有许多方法可以关闭表单,其效果与按close按钮相同,我希望它们都会遇到相同的问题。例如:例如,您可以通过按Alt+F4或右键单击标题栏并从结果菜单中选择“关闭表单”来关闭表单。我希望Windows 7会添加一个触摸手势来完成同样的操作。好的,我刚刚重新阅读了您的帖子,我明白您现在所说的。我真的不想为触发验证的按钮保留布尔值。如果没有其他解决方案,我可能最终不得不求助于此。不过,现在我将保留此问题,如果没有人能够提供解决方案,我会将此标记为已接受。谢谢!+1保留需要验证的标志是有问题的,但比OP最初要求的要少一些问题。+1您也可以使用DialogResult而不是booleans,检查我的编辑!在窗体的加载事件中将窗体的DialogResult设置为默认值Cancel。默认值为not validate,因为大多数操作都不会验证窗体。然后所有其他关闭方式都应该使用它。好的,我刚刚重新阅读了你的帖子,我明白了你现在说的话。我真的不想保留布尔around用于触发验证的按钮。如果没有其他解决方案,我可能最终不得不求助于此。现在我将保留此问题,但是,如果没有人能够提供解决方案,我会将此标记为已接受。谢谢!+1保留需要验证的标志是有问题的,但比OP最初要求的要少一些如果还使用DialogResult而不是布尔值,请检查我的编辑!在窗体的加载事件中将窗体的DialogResult设置为默认值Cancel。默认值为not validate,因为大多数操作都不会验证窗体。然后所有其他关闭方式都应使用该值。