|
|
#include <windows.h>
#include <ceconfig.h>
#ifdef __cplusplus
extern "C" { #endif /* __cplusplus */
// On non-WBT, we want to be able to hide and show the shell's taskbar.
// The two functions below were taken directly from the shell and are
// used to perform that task by WM_ACTIVATE in UIMainWndProc below.
// Only applies to non-WBT builds.
const TCHAR c_szShellAutoHide[] = TEXT("Software\\Microsoft\\Shell\\AutoHide"); void HHTaskBar_SetAutoHide(BOOL bAutoHide) { LONG lRet; HKEY hkey; DWORD dw; lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szShellAutoHide, 0, KEY_ALL_ACCESS, &hkey); if(lRet != ERROR_SUCCESS) { lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, c_szShellAutoHide, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey, &dw); } if (lRet == ERROR_SUCCESS) { RegSetValueEx(hkey, TEXT(""), 0, REG_DWORD, (LPBYTE)&bAutoHide, sizeof(DWORD)); RegCloseKey(hkey); } }
BOOL HHTaskBar_GetAutoHide(BOOL *pbAutoHide) { HKEY hkey; DWORD dw = sizeof(*pbAutoHide); DWORD dwType; if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szShellAutoHide, 0, KEY_ALL_ACCESS, &hkey)) { RegQueryValueEx(hkey, TEXT(""), 0, &dwType, (LPBYTE) pbAutoHide, &dw); RegCloseKey(hkey); return TRUE; } return FALSE; }
// We want to hide the taskbar if it's not in AutoHide mode and we're
// being activated. Because we may have two separate TSC connections
// active, we want to guard against problems that could result from
// differing order of operations (like the taskbar being taken out of
// AutoHide mode when a TSC window is still in use). In order to do
// that, we'll create a system-wide named Mutex that we'll use to
// indicate when we need to restore the taskbar's state.
const TCHAR psWinCEHPCTaskBarMutexName[] = TEXT("WinCEHPCTaskBarMutex");
// This function is called when the main window proc receives an WM_ACTIVATE
// message. wParam indicates if we're being minimized or maximized, hwnd
// is variable received from main window proc.
// BUGBUG - to make ActiveX control work we may need to expose/doc this function.
void AutoHideCE(HWND hwnd, WPARAM wParam) { static HANDLE hWinCEHPCTaskBarMutex = 0; HWND hwndTaskBar;
hwndTaskBar = FindWindow(TEXT("HHTaskBar"), NULL); if(0 != hwndTaskBar) { BOOL bActivating = LOWORD(wParam) != WA_INACTIVE; if(bActivating) { // Window is being displayed
// Assume that the taskbar is not in AutoHide mode, then find
// out what mode it IS in
#define WM_USER 0x0400
#define WM_TASKBAR_FULLSCREEN (WM_USER + 7)
#define SHFS_SHOWTASKBAR 0x0001
#define SHFS_HIDETASKBAR 0x0002
// BUGBUG -- this has not been well tested/integrated on Palmsized.
// Use at your own risk.
if (g_CEConfig == CE_CONFIG_PALMSIZED) {
PostMessage(hwndTaskBar, WM_TASKBAR_FULLSCREEN, (WPARAM)hwnd, SHFS_HIDETASKBAR); } else { BOOL bAutoHide = FALSE; HHTaskBar_GetAutoHide(&bAutoHide); if(bAutoHide) { // Auto-Hide is already active - see if that's because
// some other TSC window is responsible
hWinCEHPCTaskBarMutex = CreateMutex(0, FALSE, psWinCEHPCTaskBarMutexName); if((0 != hWinCEHPCTaskBarMutex) && (ERROR_ALREADY_EXISTS != GetLastError())) { // We just created this Mutex, so Auto-Hide was
// enabled by the user. Throw-away the Mutex we
// just created so we know that this TSC window
// didn't enable Auto-Hide.
CloseHandle(hWinCEHPCTaskBarMutex); hWinCEHPCTaskBarMutex = 0; } else { // The Mutex was already present, so keep a handle on
// it as a reference-count
} } else { // We're about to set Auto-Hide, so create the Mutex to
// tell other TSC windows that we've done so
hWinCEHPCTaskBarMutex = CreateMutex(0, FALSE, psWinCEHPCTaskBarMutexName); if(0 != hWinCEHPCTaskBarMutex) { // Only hide the taskbar if we were able to indicate
// that we have done so
HHTaskBar_SetAutoHide(TRUE); PostMessage(hwndTaskBar, WM_WININICHANGE, 0, 5000); } } // If this or any other TSC window set Auto-Hide, then
// (hWinCEHPCTaskBarMutex != 0) now
} } else { // BUGBUG -- this has not been well tested/integrated on Palmsized devices.
// Use at your own risk.
if (g_CEConfig == CE_CONFIG_PALMSIZED) { PostMessage(hwndTaskBar, WM_TASKBAR_FULLSCREEN, (WPARAM)hwnd, SHFS_SHOWTASKBAR); } // Window is being hiden
if(0 != hWinCEHPCTaskBarMutex) { // Some TSC window set the taskbar into Auto-Hide mode
// Discard our Mutex handle to drop the reference-count
// and see if the Mutex stays around
CloseHandle(hWinCEHPCTaskBarMutex); hWinCEHPCTaskBarMutex = CreateMutex(0, FALSE, psWinCEHPCTaskBarMutexName); if(0 != hWinCEHPCTaskBarMutex) { if(ERROR_ALREADY_EXISTS == GetLastError()) { // The Mutex was still present, so there is at
// least one other TSC window that's active.
// So we do nothing here.
} else { // The Mutex went away after we closed our Mutex handle, so we are the last TSC window
// We need to restore the Auto-Hide setting (and we know it used to be FALSE because
// the Mutex was present)
HHTaskBar_SetAutoHide(FALSE); PostMessage(hwndTaskBar, WM_WININICHANGE, 0, 5000); } // We didn't really want a handle to the Mutex, so
// discard it now.
CloseHandle(hWinCEHPCTaskBarMutex); } } else { // The Mutex was not present, so no TSC window set the
// taskbar into Auto-Hide mode. That means we don't need
// to restore anything here.
} } } }
#ifdef __cplusplus
} #endif /* __cplusplus */
|