一日分の備忘録

ゲーム制作におけるいろいろな実装の備忘録。基本的にはゲームエンジン中心。その中でもUE4がメイン。プログラマーなのでプログラム的な記事が多くなるかも

ウインドウのアクティブ・非アクティブの瞬間を取得する方法の備忘録

どうやら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