0

.net 2.0 Windows フォーム アプリケーションがあります。

フォームでのユーザー アクティビティをキャプチャするために、WndProc メソッドをオーバーライドしました。

元:

const int HTCLOSE           = 0x0014;
bool m_bCloseButtonActive   = false;

if (m.Msg == WM_NCHITTEST)
{
    base.WndProc(ref m);
    m_bCloseButtonActive = (m.Result.ToInt32() == HTCLOSE);
}

m_bClos​​eButtonActive の値に基づいて、さらにアクションを実行します。

現在私が直面している問題は、オペレーティング システム Vista 以降 (Windows 7 でさえも) で [閉じる] ボタンをクリックしたイベントをキャプチャできないため、フォームが閉じないことです。

つまり、条件m.Result.ToInt32() == HTCLOSEが true になることはなく、閉じるボタンをクリックしてもフォームが閉じません。

私のアプリケーションは以前の OS (Windows 2000、XP、XP Embedded) で動作します。また興味深いのは、指定すると機能することです

Application.VisualStyleState = System.Windows.Forms.VisualStyles.VisualStyleState.ClientAreaEnabled;

ここで何が起こっているのか、どんな考えでも。これはデスクトップ Windows マネージャーに関連するものですか? 私のアプリケーションは閉じるボタンのクリック イベントをトラップできません。

前もって感謝します

4

2 に答える 2

6

ヒット テスト メッセージは、これを行う適切な方法ではないように思えます。たとえば、ユーザーがシステム メニューまたは Alt+F4 ショートカットを使用してフォームを閉じた場合はどうなるでしょうか。

WM_SYSCOMMANDでメッセージに応答する必要があると思いますwParam == SC_CLOSE

非クライアント領域の処理に関しては、Windows Aero は根本的に異なります。これは、2000/XP で動作する理由と、DWM を無効にした場合を説明しています。ただし、使用WM_SYSCOMMANDはすべてのバージョンの Windows で機能します。

WM_SYSCOMMANDメッセージ パラメータにはマスクする必要のある追加情報が含まれているため、MSDN のドキュメントを注意深く読む必要があることに注意してください。閉じるボタンを検出するには、次のようなコードが必要です。

const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_SYSCOMMAND)
        if ((m.WParam.ToInt32() & 0xFFF0) == SC_CLOSE)
            MessageBox.Show("close button pressed");
    }
    base.WndProc(ref m);
}

ユーザーがフォームを閉じたときの動作を変更したい場合は、Closingイベントを処理してみませんか?

于 2011-03-21T09:43:23.860 に答える
-1

これは最終的に機能しました... 非クライアントの HITTEST 情報の代わりに WM_NCMOUSEMOVE を使用しました。WParam には関連するすべてのイベントが含まれていました。

このリンクは役に立ちました: http://social.msdn.microsoft.com/Forums/en/windowsuidevelopment/thread/9a8a63c8-79b5-43a8-82eb-f659be947add

const int WM_NCMOUSEMOVE = 0x00A0;

  if (m.Msg == WM_NCMOUSEMOVE)
    {
    base.WndProc(ref m);
    if ((m.WParam.ToInt32() == HTCLOSE))
    {
      m_bCloseButtonActive = true;
    }
   }
于 2011-03-21T15:10:16.303 に答える