diff --git a/reactos/dll/win32/user32/windows/window.c b/reactos/dll/win32/user32/windows/window.c index d21f0c32647..163831a5af8 100644 --- a/reactos/dll/win32/user32/windows/window.c +++ b/reactos/dll/win32/user32/windows/window.c @@ -1586,25 +1586,23 @@ SetProgmanWindow(HWND hWnd) } /* - * @unimplemented + * @implemented */ HWND STDCALL GetProgmanWindow(VOID) { - UNIMPLEMENTED; - return FALSE; + return (HWND)NtUserGetThreadState(THREADSTATE_PROGRAMWINDOW); } /* - * @unimplemented + * @implemented */ HWND STDCALL GetTaskmanWindow(VOID) { - UNIMPLEMENTED; - return FALSE; + return (HWND)NtUserGetThreadState(THREADSTATE_TASKMANWINDOW); } /* diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index c420675da13..f0e84cdc5b5 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -8,6 +8,8 @@ typedef struct _DESKTOP { HANDLE hKernelHeap; WCHAR szDesktopName[1]; + HWND hTaskManWindow; + HWND hProgmanWindow; } DESKTOP, *PDESKTOP; typedef struct _CALLPROC @@ -1117,6 +1119,8 @@ NtUserGetThreadDesktop( #define THREADSTATE_GETTHREADINFO (0) #define THREADSTATE_FOCUSWINDOW (1) #define THREADSTATE_INSENDMESSAGE (2) +#define THREADSTATE_PROGMANWINDOW (3) +#define THREADSTATE_TASKMANWINDOW (4) DWORD NTAPI NtUserGetThreadState( diff --git a/reactos/subsystems/win32/win32k/ntuser/misc.c b/reactos/subsystems/win32/win32k/ntuser/misc.c index f14fd82df9a..9922b2c0c07 100644 --- a/reactos/subsystems/win32/win32k/ntuser/misc.c +++ b/reactos/subsystems/win32/win32k/ntuser/misc.c @@ -856,19 +856,11 @@ NtUserCallHwndOpt( switch (Routine) { case HWNDOPT_ROUTINE_SETPROGMANWINDOW: - /* - * FIXME - * Nothing too hard...validate the hWnd and save it in the Desktop Info - */ - DPRINT1("HWNDOPT_ROUTINE_SETPROGMANWINDOW UNIMPLEMENTED\n"); + GetW32ThreadInfo()->Desktop->hProgmanWindow = Param; break; case HWNDOPT_ROUTINE_SETTASKMANWINDOW: - /* - * FIXME - * Nothing too hard...validate the hWnd and save it in the Desktop Info - */ - DPRINT1("HWNDOPT_ROUTINE_SETTASKMANWINDOW UNIMPLEMENTED\n"); + GetW32ThreadInfo()->Desktop->hTaskManWindow = Param; break; } @@ -902,6 +894,10 @@ NtUserGetThreadState( case THREADSTATE_FOCUSWINDOW: RETURN( (DWORD)IntGetThreadFocusWindow()); + case THREADSTATE_PROGMANWINDOW: + RETURN( (DWORD)GetW32ThreadInfo()->Desktop->hProgmanWindow); + case THREADSTATE_TASKMANWINDOW: + RETURN( (DWORD)GetW32ThreadInfo()->Desktop->hTaskManWindow); } RETURN( 0);