4

重複の可能性:
終了ハンドラーで「ウィンドウを閉じるボタンがクリックされた (X)」と window.Close() を区別する方法

WPF では、次のように を閉じるさまざまな方法がありますWindow

1) Window.Close()
2) ウィンドウ システム メニューから [閉じる] を選択します (左上)
3) ウィンドウ タイトル バーの [X] ボタンをクリックします (右上)
4) キーボード ショートカット: Alt+F4

これらすべてのアクションが WPF イベントをトリガーしますWindow.Closing

これら 2 種類のアクションをどのように区別すればよいでしょうか?

Excel/VBA ではこれが可能です: VBA.VbQueryClose.vbFormCodevs VBA.VbQueryClose.vbFormControlMenu.

この関連する質問/回答は、システム メニュー アクションが Windows イベントを生成すると述べていますWM_CLOSE。おそらく、基になる Windows イベントを WPF から確認する方法があります。

4

3 に答える 3

6

HwndSource.AddHook を呼び出して Win32 メッセージを処理し、ウィンドウの終了理由を取得できます。何かのようなもの:

Window myWindow = new Window();
myWindow .Loaded += delegate
{
    HwndSource source = (HwndSource)PresentationSource.FromDependencyObject(myWindow );
    source.AddHook(WindowProc);
};

そして WindowProc の実装:

    private static IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam,      
      ref bool handled){
     switch (msg)
     {
         case: 0x10:
              Console.WriteLine("Close reason: Clicking X");
         case 0x11:
         case 0x16:
             Console.WriteLine("Close reason: WindowsShutDown");
             break;

         case 0x112:
             if (((ushort)wParam & 0xfff0) == 0xf060)
                 Console.WriteLine("Close reason: User closing from menu");
             break;
     }
     return IntPtr.Zero;
    }

そして、すべての Windows メッセージのリストがあります

WM_SYSCOMMND の wParam の値

お役に立てれば。

于 2012-12-13T08:14:32.073 に答える
4

簡単なオプションの1つは、Window.Close自分自身を呼び出す前にフラグを設定することです。

于 2012-12-13T07:28:59.633 に答える
1

もちろん、これは を押したときにも発生する可能性がありますAlt +F4
マウスイベントを扱っている場合は、マウスがどの要素の上にあるかを確認してください。

于 2012-12-13T07:35:40.433 に答える