BUG: EnumDesktopWindows Might Enumerate the Wrong Desktop

ID: Q198590

The information in this article applies to:

SYMPTOMS

If a desktop has no child windows, a call to EnumDesktopWindows may enumerate windows on a different desktop.

CAUSE

This is caused by a bug in the operating system.

RESOLUTION

To ensure that EnumDesktopWindows is enumerating the intended desktop, use GetWindowThreadProcessID, GetThreadDesktop, and/or GetUserObjectInformation functions to verify that the desktop is correct.

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.

MORE INFORMATION

This bug will affect those applications that attempt to enumerate a desktop immediately after it has been created, or in a scenario where there are currently no child windows of the desktop.

The following code snippet uses GetThreadDesktop() to validate that the correct desktop is being enumerated.

   HDESK hdesk;
   hdesk = GetThreadDesktop( GetCurrentThreadId() );
   EnumDesktopWindows( hdesk, EnumProc, (LPARAM)hdesk );
   .
   .
   .
   return;

   BOOL CALLBACK EnumProc( HWND hwnd, LPARAM lParam )
   {
      DWORD dwThreadId;
      HDESK hdesk;

      dwThreadId = GetWindowThreadProcessId( hwnd, NULL );
      hdesk = GetThreadDesktop( dwThreadId );

      if( hdesk && hdesk != (HDESK)lParam ) {
        return FALSE;
      } else {
        // now certain this is the desktop we want to enumerate
        .
        .
        .
      }

      return TRUE;
   }

Additional query words: kbDSupport
Keywords          : kbNTOS400bug kbScreenSaver kbWndwMsg 
Version           : WINNT:4.0
Platform          : winnt
Issue type        : kbbug
Solution Type     : kbpending

Last Reviewed: March 18, 1999