WinCE GetForegroundWindow 使用的困惑
此问题没有解决,也没有搞清楚什么!在此提出,以备遇到同样/类似问题的人参考。
在显示框架的基础上,增加如下防止异常的代码后,某一项目 导航加载时没有加载中的界面显示;若没有此段代码,则可以显示导航启动时的加载中界面。
分析此段代码,在进入导航功能时,此段代码除了获取几个变量的值外,其实是没有执行任何代码的。所以很是困惑!
试着注释代码、然后运行看究竟是哪一句引起上述现象的。最后发现是调用函数 GetForegroundWindow() 引起的。此函数为系统 API,功能是获取顶层窗体。难道在获取顶层窗体时,此函数还执行了其它动作?
但是要对比 WinCE 系统顶层窗体与 HMI 系统的顶层窗体是否相同,就必要调用函数 GetForegroundWindow()。否则,如何判断呢?
GetForegroundWindow() 函数在 MSDN 中的说明很是简单,没有其它任何需注意的事项。
1 { 2 HWND hWndFore = GetForegroundWindow(); 3 HWND hWndFrameTop; 4 5 ZeroMemory(tcTitleCE,sizeof(TCHAR) * MAX_PATH); 6 GetWindowText(hWndFore,tcTitleCE,MAX_PATH); 7 if(WINDOW_ID_NAVI != wParam 8 #if _THIRD_ALINK_FUNC_ 9 && WINDOW_ID_NAVI != wParam 10 #endif 11 #if _USER_MIRROR_LINK_THIRD_APP_ 12 && WINDOW_ID_MIRROLINK != wParam 13 #endif 14 ) 15 { 16 hWndFrameTop = GuiMgrGetWindowHWND(GetDstWinID(wParam)); 17 if(NULL != hWndFrameTop) 18 { 19 if(hWndFore != hWndFrameTop && 0 != wcscmp(WNDNAME_FRONT_VOL_UI,tcTitleCE)) 20 { 21 bIsWinHasShown = FALSE; 22 RETAILMSG(_ENABLE_IMPORTANT_LOG_,(L"[MP]enter GUI Manager::Execute - 0x%x <> %s\r\n", 23 wParam,tcTitleCE)); 24 } 25 } 26 } 27 else 28 { 29 // 三个第三方程序未做异常处理??? 30 } 31 }
最后,将代码修改为:
1 { 2 if(WINDOW_ID_NAVI != wParam 3 #if _THIRD_ALINK_FUNC_ 4 && WINDOW_ID_NAVI != wParam 5 #endif 6 #if _USER_MIRROR_LINK_THIRD_APP_ 7 && WINDOW_ID_MIRROLINK != wParam 8 #endif 9 ) 10 { 11 HWND hWndFrameTop = GuiMgrGetWindowHWND(GetDstWinID(wParam)); 12 if(NULL != hWndFrameTop) 13 { 14 HWND hWndFore = GetForegroundWindow(); 15 GetWindowText(hWndFore,tcTitleCE,MAX_PATH); 16 if(hWndFore != hWndFrameTop && 0 != wcscmp(WNDNAME_FRONT_VOL_UI,tcTitleCE)) 17 { 18 bIsWinHasShown = FALSE; 19 RETAILMSG(_ENABLE_IMPORTANT_LOG_,(L"[MP]enter GUI Manager::Execute - 0x%x <> %s\r\n", 20 wParam,tcTitleCE)); 21 } 22 } 23 } 24 else 25 { 26 // 三个第三方程序未做异常处理??? 27 } 28 } 29 #endif
在启动导航时不在执行函数 GetForegroundWindow()。