您好 我有一个简单的c-sharp windows应用程序。 我在这个表单上有一个按钮,它启动另一个非模态弹出窗体(固定工具窗口)。在弹出窗体中,我一直跟踪用户在弹出窗体上执行的窗口消息。每当用户关闭表单(弹出窗口)时,我将标志m_bQueryShutdownSent设置为true,这表示主表单要做某事。
我使用
行m_bCloseButtonActive = (m.Result.ToInt32() == HTCLOSE);
跟踪用户是否点击了关闭按钮并设置了标志m_bCloseButtonActive
#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
非常感谢这方面的任何帮助
答案 0 :(得分:3)
没有真正的线索为什么你这样做。您通常使用FormClosed事件来查找表单已关闭。 e.CloseReason属性告诉您原因,CloseReason.WindowsShutDown与检查WM_QUERYENDSESSION完全等效。如果要使此关闭条件成为条件,则改为使用FormClosing事件。
当用户通过单击“关闭”按钮以外的方式关闭表单时,这也能正常工作。就像按下Alt + F4一样,使用系统菜单或Win7中的任务栏按钮缩略图。