ID: Q198590
The information in this article applies to:
If a desktop has no child windows, a call to EnumDesktopWindows may enumerate windows on a different desktop.
This is caused by a bug in the operating system.
To ensure that EnumDesktopWindows is enumerating the intended desktop, use GetWindowThreadProcessID, GetThreadDesktop, and/or GetUserObjectInformation functions to verify that the desktop is correct.
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.
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