From a couple of preliminary tests it seems that EnumWindows always returns windows in reverse instantiation order, i.e. most recently instantiated window first. Is that a valid observation? If so, is it true across all versions of Windows? And is this a reliable assumption, i.e. is that behaviour documented somewhere?
Context: I’m dealing with a situation where I am triggering a third-party application to open several non-modal windows and I need to send some window messages to those windows once they’re open, yet I have no sure-fire way of identifying them as neither their window classes nor their captions will differ and I also do not know their expected coordinates. However, if I could rely on the above behaviour of EnumWindows I could simply use the first handle returned by EnumWindows whose class and caption match my expectation. That still leaves some hypothetical loop holes but I think it will be good enough. Alternative suggestions welcome nevertheless.
It returns them in Z order. First the top-most window with
WS_EX_TOPMOSTset, until the bottom-most window withWS_EX_TOPMOST set, then the top-most window withoutWS_EX_TOPMOST, though to the bottom-most window withoutWS_EX_TOPMOST. Note that visibility is not a determining factor, so an invisible window that’s higher in the Z-order than a visible window will still appear before it.EDIT:
It’s highly unlikely that you could use this as you want, just taking the first return from
EnumWindows. Not only is your new window unlikely to be the first return, but you’d have a race condition where other windows could be opened in the meantime. You could, however, keep a list of all known windows for the application, and when you need to find a newly opened window, callEnumWindowsand compare the window handles to those in your list. When you find one that has the correct class and caption (you might even check that it belongs to the right process withGetWindowThreadProcessID) that is not in your list, then you’ve found the new window.For your purposes, though, you may be even better served by installing a CBT hook and watching for the HCBT_CREATEWND notification. See MSDN help on
SetWindowsHookEx()and theCBTProccallback for more information.Level of certainty about enumeration order:
A number of comments and other answers to this question have mentioned a lack of precise documentation in MSDN about the order in which
EnumWindowsreturns window handles. And indeed, the pages onEnumWindowsand theEnumWindowsProccallback are both quite silent on the issue. I offer as evidence the following:A C++ Q&A article in MSDN magazine does state specifically:
The page on
EnumChildWindowsalludes to the order in the remarks section:This implies that the order is Z-order dependent. And since, in the description of the hWndParent parameter, it says this:
one can assume that the same logic and ordering applies to
EnumWindows.Of course, this is all very academic at this point, since
EnumWindowsis probably not the best solution for the OP’s problem—at the very leastEnumThreadWindowswould probably be a better fit—but I thought it was worth mentioning for other people who might come across this post.