179 lines
7 KiB
C++
179 lines
7 KiB
C++
#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 */
|