23#include <commoncontrols.h>
29#define WM_APP_TRAYDESTROY (WM_APP + 0x100)
31#define TIMER_ID_AUTOHIDE 1
32#define TIMER_ID_MOUSETRACK 2
33#define MOUSETRACK_INTERVAL 100
34#define AUTOHIDE_DELAY_HIDE 2000
35#define AUTOHIDE_DELAY_SHOW 50
36#define AUTOHIDE_INTERVAL_ANIMATING 10
38#define AUTOHIDE_SPEED_SHOW 10
39#define AUTOHIDE_SPEED_HIDE 1
41#define AUTOHIDE_HIDDEN 0
42#define AUTOHIDE_SHOWING 1
43#define AUTOHIDE_SHOWN 2
44#define AUTOHIDE_HIDING 3
47#define IDHK_MINIMIZE_ALL 0x1f5
48#define IDHK_RESTORE_ALL 0x1f6
49#define IDHK_HELP 0x1f7
50#define IDHK_EXPLORE 0x1f8
51#define IDHK_FIND 0x1f9
52#define IDHK_FIND_COMPUTER 0x1fa
53#define IDHK_NEXT_TASK 0x1fb
54#define IDHK_PREV_TASK 0x1fc
55#define IDHK_SYS_PROPERTIES 0x1fd
56#define IDHK_DESKTOP 0x1fe
57#define IDHK_PAGER 0x1ff
150 RECT rcWindow, rcMonitor, rcIntersect;
151 rcMonitor =
info.rcMonitor;
191const GUID IID_IShellDesktopTray = { 0x213e2df9, 0x9a14, 0x4328, { 0x99, 0xb1, 0x69, 0x61, 0xf9, 0x14, 0x3c, 0xe9 } };
242 NONCLIENTMETRICS ncm = {
sizeof(ncm)};
249 ncm.lfCaptionFont.lfWeight =
FW_BOLD;
277 WCHAR szStartCaption[32];
283 wcscpy(szStartCaption,
L"Start");
326 public CWindowImpl<CTrayShowDesktopButton, CWindow, CControlWinTraits>
341#define SHOW_DESKTOP_MINIMUM_WIDTH 3
363 if (nTime1 - nTime0 >= 600)
371#define TSDB_CLICK (WM_USER + 100)
420 return ::PtInRect(&rc,
pt);
423#define SHOW_DESKTOP_TIMER_ID 999
424#define SHOW_DESKTOP_TIMER_INTERVAL 200
520 public CWindowImpl < CTrayWindow, CWindow, CControlWinTraits >,
522 public IShellDesktopTray,
640 WCHAR szCommand[256];
641 WCHAR *pszParameters;
651 pszParameters =
wcschr(szCommand,
L'>');
703 CStringW strDefaultDir, strHomePath;
706 strDefaultDir += strHomePath;
719 return This->RunFileDlgThread();
728 if (hRunDlg !=
NULL &&
772 return This->TrayPropertiesThread();
782 if (hTrayProp !=
NULL &&
915 TRACE(
"ITrayWindow::ExecContextMenuCmd(%u): Unhandled Command ID!\n", uiCmd);
1072 if (hwndExclude !=
NULL)
1112 tmp.
cbSize =
sizeof(tmp);
1119 fuFlags |= (TrackUp ? TPM_VERNEGANIMATION : TPM_VERPOSANIMATION);
1159 TRACE(
"Before Query\n");
1160 hr = contextMenu->QueryContextMenu(popup, 0, 0,
UINT_MAX, CMF_NORMAL);
1163 TRACE(
"Query failed\n");
1168 TRACE(
"Before Tracking\n");
1186 TRACE(
"Before InvokeCommand\n");
1188 cmi.
cbSize =
sizeof(cmi);
1191 hr = contextMenu->InvokeCommand(&cmi);
1195 TRACE(
"TrackPopupMenu failed. Code=%d, LastError=%d\n", uCommand,
GetLastError());
1219 NONCLIENTMETRICS ncm = {
sizeof(ncm)};
1222 ERR(
"SPI_GETNONCLIENTMETRICS failed\n");
1233 ERR(
"CreateFontIndirect failed\n");
1284 pt.x = pRect->left + ((pRect->right - pRect->left) / 2);
1285 pt.y = pRect->top + ((pRect->bottom - pRect->top) / 2);
1300 if (hMonitor !=
NULL)
1314 goto GetPrimaryRect;
1362 IN const SIZE *pTraySize,
1368 pRect->right = pRect->left + pTraySize->cx;
1372 pRect->bottom = pRect->top + pTraySize->cy;
1376 pRect->left = pRect->right - pTraySize->cx;
1381 pRect->top = pRect->bottom - pTraySize->cy;
1391 if (pTraySize ==
NULL)
1423 szWnd.
cx = pRect->right - pRect->left;
1424 szWnd.
cy = pRect->bottom - pRect->top;
1429 MONITOR_DEFAULTTONEAREST);
1435 if (szWnd.
cx > szMax.
cx)
1436 szWnd.
cx = szMax.
cx;
1437 if (szWnd.
cy > szMax.
cy)
1438 szWnd.
cy = szMax.
cy;
1452 GetMinimumWindowSize(
1476 SIZE DeltaPt, ScreenOffset;
1492 goto GetPrimaryScreenRect;
1507GetPrimaryScreenRect:
1508 ScreenOffset.
cx = 0;
1509 ScreenOffset.
cy = 0;
1515 if (
pt.x < rcScreen.
right / 2)
1547 if (hMon != hMonNew)
1580 pt.x = pRect->left + ((pRect->right - pRect->left) / 2);
1581 pt.y = pRect->top + ((pRect->bottom - pRect->top) / 2);
1595 rcTray.
left = pwp->x;
1596 rcTray.
top = pwp->y;
1630 rcTray.
left = pwp->x;
1631 rcTray.
top = pwp->y;
1676 pwp->x = rcTray.
left;
1677 pwp->y = rcTray.
top;
1685 RECT rcClip, rcWindow;
1723 RECT rcTray, rcWorkArea;
1797 SIZE WndSize, EdgeSize, DlgFrameSize;
1837 WndSize.
cx = 2 * (EdgeSize.
cx + DlgFrameSize.
cx);
1838 WndSize.
cy = StartBtnSize.
cy + (2 * (EdgeSize.
cy + DlgFrameSize.
cy));
1842 WndSize.
cx = StartBtnSize.
cx;
1843 WndSize.
cy = StartBtnSize.
cy - EdgeSize.
cy;
1874 SIZE TraySize, StartSize;
1875 POINT ptTrayNotify = { 0, 0 };
1880 if (prcClient !=
NULL)
1882 rcClient = *prcClient;
1906 if (StartSize.
cx > rcClient.
right)
1907 StartSize.
cx = rcClient.
right;
1910 if (hwndTaskToolbar)
1930 ERR(
"DeferWindowPos for start button failed. lastErr=%d\n",
GetLastError());
1984 ptTrayNotify.
x = rcClient.
right - TraySize.
cx;
1986 ptTrayNotify.
y = rcClient.
bottom - TraySize.
cy;
1998 ERR(
"DeferWindowPos for notification area failed. lastErr=%d\n",
GetLastError());
2006 POINT ptRebar = { 0, 0 };
2014 szRebar.
cx = ptTrayNotify.
x - ptRebar.
x;
2021 szRebar.
cy = ptTrayNotify.
y - ptRebar.
y;
2047 RECT rebarRect, taskbarRect, clientRect;
2064 pRect->
bottom = pRect->
top + rebarRect.bottom - rebarRect.top +
margins.cy;
2067 rebarRect.top = rebarRect.bottom - (pRect->
bottom - pRect->
top -
margins.cy);
2069 pRect->
top = pRect->
bottom - (rebarRect.bottom - rebarRect.top +
margins.cy);
2072 rebarRect.right = rebarRect.left + (pRect->
right - pRect->
left -
margins.cx);
2074 pRect->
right = pRect->
left + (rebarRect.right - rebarRect.left +
margins.cx);
2077 rebarRect.left = rebarRect.right - (pRect->
right - pRect->
left -
margins.cx);
2079 pRect->
left = pRect->
right - (rebarRect.right - rebarRect.left +
margins.cx);
2100 pt.y = rcExclude.
top;
2110 pt.y = rcExclude.
top;
2115 pt.y = rcExclude.
top;
2147 TRACE(
"AutoHide cancelling hide.\n");
2153 TRACE(
"AutoHide starting show.\n");
2162 TRACE(
"AutoHide cancelling show.\n");
2168 TRACE(
"AutoHide starting hide.\n");
2451 RECT rcGripper = {0};
2542 ((ITrayWindow*)
this)->
AddRef();
2621#define TIMER_ID_IGNOREPULSERESET 888
2622#define TIMER_IGNOREPULSERESET_TIMEOUT 200
2652 if (
wParam == SPI_SETNONCLIENTMETRICS)
2691 switch (pCopyData->
dwData)
2708 RECT rcButton, rcWnd;
2779 if (
pt.x < rcClient.
left)
2784 if (
pt.y < rcClient.
top)
2852 rcClient.
left = rcClient.
top = 0;
2896 static const UINT uidDisableItem [] = {
2910 if (hSysMenu !=
NULL)
3028 if (
pt.x != -1 ||
pt.y != -1)
3050 POINT ptClient = *ppt;
3056 if (hWndAtPt !=
NULL &&
3065 goto HandleTrayContextMenu;
3071 goto HandleTrayContextMenu;
3075HandleTrayContextMenu:
3245 return wcscmp(szClass,
L"#32770") == 0;
3254 if (!
info->bShowDesktop)
3269 info->pMinimizedAll->Add(mwp);
3286 info.bShowDesktop = bShowDesktop;
3393 rc = &prms->
rgrc[0];
3459 szWindow.
cx - szTarget.
cx,
3460 szWindow.
cy - szTarget.
cx,
3466 szWindow.
cx = szActual.
cx + borders.
cx;
3469 szWindow.
cy = szActual.
cy + borders.
cy;
3472 szWindow.
cx = szActual.
cx + borders.
cx;
3476 szWindow.
cy = szActual.
cy + borders.
cy;
3634 if (!Ret || Ret == -1)
3659 TRACE(
"IShellDesktopTray::GetState() unimplemented!\n");
3665 TRACE(
"IShellDesktopTray::GetTrayWindow(0x%p)\n", phWndTray);
3672 TRACE(
"IShellDesktopTray::RegisterDesktopWindow(0x%p)\n", hWndDesktop);
3680 TRACE(
"IShellDesktopTray::Unknown(%u,%u) unimplemented!\n", dwUnknown1, dwUnknown2);
3733 this->hWndOwner = hWndOwner;
3734 this->m_idCmdCmFirst = 0;
3776 m_idCmdCmFirst = idCmdNext - idCmdFirst;
3780 if (TrayWnd->m_TrayBandSite !=
NULL)
3783 if (
FAILED(TrayWnd->m_TrayBandSite->AddContextMenus(
3791 WARN(
"AddContextMenus failed.\n");
3805 if (uiCmdId >= m_idCmdCmFirst)
3812 cmici.
cbSize =
sizeof(cmici);
3813 cmici.
hwnd = hWndOwner;
3817 pcm->InvokeCommand(&cmici);
3822 TrayWnd->ExecContextMenuCmd(uiCmdId);
3869 *ppTray = (ITrayWindow *) Tray;
HINSTANCE hExplorerInstance
VOID DisplayTrayProperties(IN HWND hwndOwner, IN HWND hwndTaskbar)
#define TWM_OPENSTARTMENU
#define TSWM_UPDATETASKBARPOS
#define TNWM_GETMINIMUMSIZE
HRESULT CStartMenuBtnCtxMenu_CreateInstance(ITrayWindow *TrayWnd, IN HWND hWndOwner, IContextMenu **ppCtxMenu)
HMENU LoadPopupMenu(IN HINSTANCE hInstance, IN LPCWSTR lpMenuName)
#define TWM_GETTASKSWITCH
IMenuPopup * CreateStartMenu(IN ITrayWindow *Tray, OUT IMenuBand **ppMenuBand, IN HBITMAP hbmBanner OPTIONAL, IN BOOL bSmallIcons)
TaskbarSettings g_TaskbarSettings
HRESULT CTrayNotifyWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv)
HRESULT CTrayBandSite_CreateInstance(IN ITrayWindow *tray, IN IDeskBand *pTaskBand, OUT ITrayBandSite **pBandSite)
#define TWM_SETTINGSCHANGED
HRESULT InitShellServices(HDPA *phdpa)
HRESULT CTaskBand_CreateInstance(IN ITrayWindow *Tray, HWND hWndStartButton, REFIID riid, void **ppv)
HRESULT ShutdownShellServices(HDPA hdpa)
#define ID_SHELL_CMD_OPEN_TASKMGR
#define ID_SHELL_CMD_CUST_NOTIF
#define ID_SHELL_CMD_UNDO_ACTION
#define ID_SHELL_CMD_PROPERTIES
#define ID_SHELL_CMD_TILE_WND_H
#define IDS_TRAYWND_UNDO_TILE
#define ID_SHELL_CMD_CASCADE_WND
#define ID_SHELL_CMD_RESTORE_ALL
#define ID_SHELL_CMD_TILE_WND_V
#define ID_SHELL_CMD_SHOW_DESKTOP
#define IDS_TRAYWND_UNDO_CASCADE
#define ID_SHELL_CMD_EXPLORE_ALL_USERS
#define ID_SHELL_CMD_ADJUST_DAT
#define ID_SHELL_CMD_OPEN_ALL_USERS
#define STDMETHODCALLTYPE
BOOL GetEnvironmentVariable(_In_z_ PCXSTR pszVar)
HWND GetLastActivePopup() const
LRESULT SendMessage(UINT message, WPARAM wParam=0, LPARAM lParam=0)
HDWP DeferWindowPos(HDWP hWinPosInfo, HWND hWndInsertAfter, int x, int y, int cx, int cy, UINT uFlags)
BOOL GetWindowRect(LPRECT lpRect) const
CWindow GetParent() const
BOOL IsWindowVisible() const
BOOL IsWindowEnabled() const
BOOL PostMessage(UINT message, WPARAM wParam=0, LPARAM lParam=0)