INFO: SetActiveWindow() and SetForegroundWindow() Clarification (97925)



The information in this article applies to:

  • Microsoft Platform Software Development Kit (SDK) 1.0

This article was previously published under Q97925

SUMMARY

By default, each thread has an independent input state (its own active window, its own focus window, and so forth). The SetActiveWindow() function always logically sets a thread's active window state.

To force a window to the foreground, however, use SetForegroundWindow(). SetForegroundWindow() activates a window and forces the window into the foreground. SetActiveWindow() always activates, but it brings the active window into the foreground only if the thread is the foreground thread.

NOTE: If the target window was not created by the calling thread, the active window status of the calling thread is set to NULL, and the active window status of the thread that created the target window is set to the target window.

Applications can call AttachThreadInput() to allow a set of threads to share the same input state. By sharing input state, the threads share their concept of the active window. By doing this, one thread can always activate another thread's window. This function is also useful for sharing focus state, mouse capture state, keyboard state, and window Z-order state among windows created by different threads whose input state is shared.

MORE INFORMATION

On Microsoft Windows 98 and Microsoft Windows 2000, SetForegroundWindow is subject to limitations.

On Microsoft Windows 98, if a nonforeground thread calls SetForegroundWindow, passing the handle of a window that was not created by the calling thread, the window is not flashed on the taskbar.

If an application requires that SetForegroundWindow behave the same on all platforms, the foreground lock timeout value should be changed when the application is installed. This can be done from the setup or installation application with the following function call:
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);
				
Note that in Visual Basic code the third argument must be passed with ByVal, even if a variable is passed:
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0&, ByVal 0&, SPIF_SENDWININICHANGE Or SPIF_UPDATEINIFILE)
				
This method allows SetForegroundWindow on Windows 98 and Windows 2000 to behave the same as Windows 95 and Windows NT 4, respectively, for all applications. The setup application should warn the user that this is being done so that the user isn't surprised by the changed behavior.

On Windows 2000, the SystemParametersInfo call fails unless the calling thread can change the foreground window, so this must be called from a setup or patch application.

Modification Type:MinorLast Reviewed:7/11/2005
Keywords:kbinfo kbWndw KB97925