关闭在Windows 7上运行的.net中的非模态对话框时出现的问题

时间:2011-03-18 12:16:10

标签: .net windows-7 c#-2.0 wndproc windows-messages

您好 我有一个简单的c-sharp windows应用程序。 我在这个表单上有一个按钮,它启动另一个非模态弹出窗体(固定工具窗口)。在弹出窗体中,我一直跟踪用户在弹出窗体上执行的窗口消息。每当用户关闭表单(弹出窗口)时,我将标志m_bQueryShutdownSent设置为true,这表示主表单要做某事。

我使用

m_bCloseButtonActive = (m.Result.ToInt32() == HTCLOSE);

跟踪用户是否点击了关闭按钮并设置了标志m_bClos​​eButtonActive

#region WndProc
        const int WM_NCHITTEST      = 0x0084;
            const int WM_NCMOUSEMOVE = 0x00A0;
        const int HTCLOSE           = 0x0014;
        const int WM_QUERYENDSESSION  = 0x0011;
        private bool m_bCloseButtonActive = false;

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_NCHITTEST)
            {
                base.WndProc(ref m);
                m_bCloseButtonActive = (m.Result.ToInt32() == HTCLOSE);
            }
            else
            {
                if (m.Msg == WM_QUERYENDSESSION && this.m_oParentForm != null)
                    this.m_bQueryShutdownSent = true;

                base.WndProc(ref m);
            }
        }
        #endregion WndProc

问题是虽然这段代码适用于XP / 32bit机器。它不适用于Windows 7 x64(虽然我的应用程序配置为以32位应用程序运行)。弹出代码无法处理关闭按钮单击操作(Windows 7)。虽然这可以在32位机器上运行XP / XP-Embedded / 2000

非常感谢这方面的任何帮助

1 个答案:

答案 0 :(得分:3)

没有真正的线索为什么你这样做。您通常使用FormClosed事件来查找表单已关闭。 e.CloseReason属性告诉您原因,CloseReason.WindowsShutDown与检查WM_QUERYENDSESSION完全等效。如果要使此关闭条件成为条件,则改为使用FormClosing事件。

当用户通过单击“关闭”按钮以外的方式关闭表单时,这也能正常工作。就像按下Alt + F4一样,使用系统菜单或Win7中的任务栏按钮缩略图。