Virtual Developer Workshop: Containerized Development with Docker
Environment: Windows NT/2000, Visual C++ 6.0
One day while running an optimization utility against a VC++ project, I had the need for a tool that would allow me to cleanly shut down an out-of-process COM server. Without modifying the original source code, the best way that came to mind would be to simply post a quit message to the server's main application window. I then opened up the handy little SPY++ tool and found my window in the list, but to my disappointment I was not able to do anything interactively, so I decided to write PostMsg.
PostMsg uses a single call to the ::EnumChildWindows() API function on the current desktop window to build it's list of windows. Given how ::EnumChildWindows() iterates through the window list, I used a reverse-dependency loop via CTreeCtrl::GetParentItem() to determine the correct insertion point in the tree for each window. The search routine I wrote ended up being a recursive function because they are easy to read, small in size, and...I guess I just like recursive solutions.
I added a couple buttons Hide and Show that would allow a quick way to manipulate windows. I find them useful for those annoying applications that don't have a taskbar icon, or prevent you from repositioning or minimizing the window on the desktop. Those free ISP application banner windows come to mind as ideal candidates for this.
I should also note that PostMsg is a "Use at Your Own Risk" tool, as it allows message posting to virtually any window on the system, and this could cause problems if you aren't careful.