1

您好,我有一个简单的 c-sharp windows 应用程序。我在这个表单上有一个按钮,它启动另一个非模态弹出表单(固定工具窗口)。在弹出式表单中,我不断跟踪用户在弹出式表单上执行的 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 / 32 位机器。它不在 Windows 7 x64 上(尽管我的应用程序配置为作为 32 位应用程序运行)。弹出代码无法处理关闭按钮单击操作 (Windows 7)。虽然这在 32 位机器 XP/XP-Embedded/2000 上是可能的

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

4

1 回答 1

3

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

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

于 2011-03-18T13:41:37.037 回答