1

こんにちは私は単純なc-sharpwindowsアプリケーションを持っています。このフォームには、別の非モーダルポップアップフォーム(固定ツールウィンドウ)を起動するボタンがあります。ポップアップフォーム内では、ユーザーがポップアップフォームで実行するウィンドウメッセージを追跡し続けます。ユーザーがフォームを閉じる(ポップアップ)ときはいつでも、フラグ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ビットアプリとして実行するように構成されています)。ポップアップコードは、閉じるボタンのクリックアクションを処理できません(Windows7)。これは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 に答える