diff --git a/base/shell/explorer/traywnd.cpp b/base/shell/explorer/traywnd.cpp index b27a4689fe..76b8c9c4c8 100644 --- a/base/shell/explorer/traywnd.cpp +++ b/base/shell/explorer/traywnd.cpp @@ -301,6 +301,7 @@ class CTrayWindow : TRACKMOUSEEVENT m_MouseTrackingInfo; HDPA m_ShellServices; + DWORD m_dwLogicalDrives; public: CComPtr m_TrayBandSite; @@ -335,6 +336,7 @@ public: m_RunFileDlgOwner(NULL), m_AutoHideState(NULL), m_ShellServices(NULL), + m_dwLogicalDrives(::GetLogicalDrives()), Flags(0) { ZeroMemory(&m_TrayRects, sizeof(m_TrayRects)); @@ -2982,6 +2984,36 @@ HandleTrayContextMenu: return 0; } + LRESULT OnDeviceChange(INT code, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + WCHAR szRoot[] = L"C:\\"; + DWORD dwLogicalDrives = ::GetLogicalDrives(); + DWORD difference = (dwLogicalDrives ^ m_dwLogicalDrives); + + if (difference != 0) + { + for (DWORD i = 0; i < L'Z' - L'A' + 1; ++i) + { + if (difference & (1 << i)) + { + szRoot[0] = L'A' + i; + if (dwLogicalDrives & (1 << i)) + { + SHChangeNotify(SHCNE_DRIVEADD, SHCNF_PATHW, szRoot, NULL); + } + else + { + SHChangeNotify(SHCNE_DRIVEREMOVED, SHCNF_PATHW, szRoot, NULL); + } + } + } + + m_dwLogicalDrives = dwLogicalDrives; + } + + return TRUE; + } + LRESULT OnRebarAutoSize(INT code, LPNMHDR nmhdr, BOOL& bHandled) { #if 0 @@ -3122,6 +3154,7 @@ HandleTrayContextMenu: MESSAGE_HANDLER(WM_HOTKEY, OnHotkey) MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcSize) MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup) + MESSAGE_HANDLER(WM_DEVICECHANGE, OnDeviceChange) MESSAGE_HANDLER(TWM_SETTINGSCHANGED, OnTaskbarSettingsChanged) MESSAGE_HANDLER(TWM_OPENSTARTMENU, OnOpenStartMenu) MESSAGE_HANDLER(TWM_DOEXITWINDOWS, OnDoExitWindows) diff --git a/dll/win32/shell32/CDefView.cpp b/dll/win32/shell32/CDefView.cpp index 608101cc1f..2caaf565a5 100644 --- a/dll/win32/shell32/CDefView.cpp +++ b/dll/win32/shell32/CDefView.cpp @@ -2174,6 +2174,7 @@ LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & { case SHCNE_MKDIR: case SHCNE_CREATE: + case SHCNE_DRIVEADD: if (bParent0) { if (LV_FindItemByPidl(ILFindLastID(Pidls[0])) == -1) @@ -2189,6 +2190,7 @@ LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & case SHCNE_RMDIR: case SHCNE_DELETE: + case SHCNE_DRIVEREMOVED: if (bParent0) LV_DeleteItem(ILFindLastID(Pidls[0])); break;