プロジェクトのナビゲーション機能実装中に、特定の条件下でロードイング画面が表示されない現象が発生。この問題の原因として、Windows APIの
GetForegroundWindow()関数呼び出しが関与していることが判明した。この関数はアクティブウィンドウのハンドルを取得する目的で使用されていたが、意図せずに画面表示に影響を与えていた。
{
HWND activeWindow = GetForegroundWindow();
HWND topFrameWindow;
ZeroMemory(windowTitle, sizeof(TCHAR) * MAX_PATH);
GetWindowText(activeWindow, windowTitle, MAX_PATH);
if (WINDOW_ID_NAVI != param
#if _THIRD_ALINK_FUNC_
&& WINDOW_ID_NAVI != param
#endif
#if _USER_MIRROR_LINK_THIRD_APP_
&& WINDOW_ID_MIRROLINK != param
#endif
) {
topFrameWindow = GuiMgrGetWindowHWND(GetDstWinID(param));
if (NULL != topFrameWindow) {
if (activeWindow != topFrameWindow && 0 != wcscmp(WNDNAME_FRONT_VOL_UI, windowTitle)) {
isWindowVisible = FALSE;
RETAILMSG(_ENABLE_IMPORTANT_LOG_, (L"[MP]GUIマネージャー実行: 0x%x <> %s\r\n", param, windowTitle));
}
}
} else {
// サードパーティアプリの例外処理未実装
}
}
{
if (WINDOW_ID_NAVI != param
#if _THIRD_ALINK_FUNC_
&& WINDOW_ID_NAVI != param
#endif
#if _USER_MIRROR_LINK_THIRD_APP_
&& WINDOW_ID_MIRROLINK != param
#endif
) {
HWND topFrameWindow = GuiMgrGetWindowHWND(GetDstWinID(param));
if (NULL != topFrameWindow) {
HWND activeWindow = GetForegroundWindow();
GetWindowText(activeWindow, windowTitle, MAX_PATH);
if (activeWindow != topFrameWindow && 0 != wcscmp(WNDNAME_FRONT_VOL_UI, windowTitle)) {
isWindowVisible = FALSE;
RETAILMSG(_ENABLE_IMPORTANT_LOG_, (L"[MP]GUIマネージャー実行: 0x%x <> %s\r\n", param, windowTitle));
}
}
} else {
// サードパーティアプリの例外処理未実装
}
}
上記コードの修正ポイント:
1.
GetForegroundWindow()の呼び出しを条件分岐内部に移動
2. 変数宣言を実際の使用タイミングに合わせて遅延させた
3. ウィンドウタイトル取得処理をアクティブウィンドウ取得直後に実行
この変更により、ナビゲーション起動時に不要なウィンドウ状態の確認処理がスキップされるようになった。MSDNのドキュメントには記載がないが、GetForegroundWindow()呼び出し時に何らかの内部状態変更が発生している可能性が示唆される。