ウインドウのアクティブ・非アクティブの瞬間を取得する方法の備忘録
どうやらApplicationLifecycleComponentというものがあるらしいので使ってみた。
結果->失敗
モバイル機のみらしい・・・
ということでエンジンを見てみた。
WindowsApplication.cppで色々制御を行っていてFWindowsApplication::ProcessDeferredMessageという関数があったのでここにApplicationLifecycle(FCoreDelegates::)のデリゲート呼び出したら行けそう。
WindowsApplication.cpp 1543行目~
int32 FWindowsApplication::ProcessDeferredMessage( const FDeferredWindowsMessage& DeferredMessage ) { if ( Windows.Num() && DeferredMessage.NativeWindow.IsValid() ) { HWND hwnd = DeferredMessage.hWND; uint32 msg = DeferredMessage.Message; WPARAM wParam = DeferredMessage.wParam; LPARAM lParam = DeferredMessage.lParam; ==================================================省略================================================== ~~~~~~~1980行目くらい // Window focus and activation case WM_ACTIVATE: { EWindowActivation ActivationType; if (LOWORD(wParam) & WA_ACTIVE) { ActivationType = bForceActivateByMouse ? EWindowActivation::ActivateByMouse : EWindowActivation::Activate; } else if (LOWORD(wParam) & WA_CLICKACTIVE) { ActivationType = EWindowActivation::ActivateByMouse; } else { ActivationType = EWindowActivation::Deactivate; /********↓ここを追加↓*********/ FCoreDelegates::ApplicationWillEnterBackgroundDelegate.Broadcast(); } bForceActivateByMouse = false; UpdateAllModifierKeyStates(); if ( CurrentNativeEventWindowPtr.IsValid() ) { BOOL Result = false; Result = MessageHandler->OnWindowActivationChanged( CurrentNativeEventWindowPtr.ToSharedRef(), ActivationType ); return Result ? 0 : 1; } return 1; } break; case WM_ACTIVATEAPP: UpdateAllModifierKeyStates(); ==================================================省略================================================== }
行けました。
if (LOWORD(wParam) & WA_ACTIVE) else if (LOWORD(wParam) & WA_CLICKACTIVE)
こいつらどう挙動がちがうんだろう。
マウスでアクティブ化したときとalt+tabとかでアクティブ化した時の場合分けやろ(多分)
暇な時に要検証・・・知ってる人いたら教えて下さい。
12/29追記
Twitterで教えてもらいました
感謝です。
docs.microsoft.com