Index: reactos/dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp =================================================================== --- reactos/dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp (revision 72721) +++ reactos/dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp (working copy) @@ -25,6 +25,21 @@ static const WCHAR szProgmanClassName[] = L"Progman"; static const WCHAR szProgmanWindowName[] = L"Program Manager"; +static BOOL +WorkAreaFromWindow(LPRECT prcWorkArea, HWND hWnd) +{ + HMONITOR hMonitor = ::MonitorFromWindow(hWnd, MONITOR_DEFAULTTONULL); + + MONITORINFO MonitorInfo; + MonitorInfo.cbSize = sizeof(MonitorInfo); + if (::GetMonitorInfoW(hMonitor, &MonitorInfo)) + { + *prcWorkArea = MonitorInfo.rcWork; + return TRUE; + } + return ::SystemParametersInfoW(SPI_GETWORKAREA, 0, prcWorkArea, 0); +} + class CDesktopBrowser : public CWindowImpl, public CComObjectRootEx, @@ -150,10 +165,8 @@ FOLDERSETTINGS fs; RECT rcWorkArea; + WorkAreaFromWindow(&rcWorkArea, m_hWndShellView); - // FIXME: Add support for multi-monitor? - SystemParametersInfoW(SPI_GETWORKAREA, 0, &rcWorkArea, 0); - // TODO: Call GetClientRect for the tray window and make small computation // to be sure the tray window rect is removed from the work area! #if 0 @@ -362,12 +375,10 @@ m_hWndShellView != NULL) { RECT rcWorkArea; + WorkAreaFromWindow(&rcWorkArea, m_hWndShellView); - // FIXME: Add support for multi-monitor! // FIXME: Maybe merge with the code that retrieves the // work area in CDesktopBrowser::CreateDeskWnd ? - SystemParametersInfoW(SPI_GETWORKAREA, 0, &rcWorkArea, 0); - ::SetWindowPos(m_hWndShellView, NULL, rcWorkArea.left, rcWorkArea.top, rcWorkArea.right - rcWorkArea.left, Index: reactos/win32ss/user/ntuser/sysparams.c =================================================================== --- reactos/win32ss/user/ntuser/sysparams.c (revision 72721) +++ reactos/win32ss/user/ntuser/sysparams.c (working copy) @@ -1015,25 +1015,27 @@ case SPI_SETWORKAREA: { - /* FIXME: We should set the work area of the monitor - that contains the specified rectangle */ - PMONITOR pmonitor = UserGetPrimaryMonitor(); + PMONITOR pmonitor; RECT rcWorkArea; - if(!pmonitor) + if (!SpiSet(&rcWorkArea, pvParam, sizeof(RECTL), fl)) return 0; - if (!SpiSet(&rcWorkArea, pvParam, sizeof(RECTL), fl)) + pmonitor = UserMonitorFromRect((RECTL *)&rcWorkArea, + MONITOR_DEFAULTTOPRIMARY); + if (pmonitor == NULL) return 0; /* Verify the new values */ - if (rcWorkArea.left < 0 || - rcWorkArea.top < 0 || - rcWorkArea.right > gpsi->aiSysMet[SM_CXSCREEN] || - rcWorkArea.bottom > gpsi->aiSysMet[SM_CYSCREEN] || + if (rcWorkArea.left < gpsi->aiSysMet[SM_XVIRTUALSCREEN] || + rcWorkArea.top < gpsi->aiSysMet[SM_YVIRTUALSCREEN] || + rcWorkArea.right > gpsi->aiSysMet[SM_XVIRTUALSCREEN] + gpsi->aiSysMet[SM_CXVIRTUALSCREEN] || + rcWorkArea.bottom > gpsi->aiSysMet[SM_YVIRTUALSCREEN] + gpsi->aiSysMet[SM_CYVIRTUALSCREEN] || rcWorkArea.right <= rcWorkArea.left || rcWorkArea.bottom <= rcWorkArea.top) + { return 0; + } pmonitor->rcWork = rcWorkArea; if (fl & SPIF_UPDATEINIFILE)