Knowledge Base

BUG: EnumDesktopWindows Might Enumerate the Wrong Desktop

Article ID: 198590

Article Last Modified on 3/21/2005


APPLIES TO


This article was previously published under Q198590

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. Be sure to free any desktop handles opened with GetThreadDesktop() by calling CloseDesktop().

   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: kbbug kbscreensaver kbpending KB198590