PostMsg - Post a message to any window on the desktop
Environment: Windows NT/2000, Visual C++ 6.0
Purpose:
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.
Functionality:
PostMsg is a simple dialog application that mimics part of the functionality of SPY++, in that it gets a list of all windows on the current desktop and displays them in a child-parent manner via a standard tree control, exactly like SPY++ does. The next thing the user will need is a list of common windows messages to select from. PostMsg uses a msg.dat file that was basically grep'd from winuser.h, so it should be fairly complete, and includes both the messages defined in hex and decimal values. PostMsg will look for msg.dat in it's startup directory. New messages can be used by adding them to msg.dat and restarting the application. PostMsg also provides a case-insensitive way to do a substring search for a particular window title.
Technology:
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.
Author's Notes:
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.

Comments
buy cheap generic discount viagra
Posted by Sildenafil on 03/31/2013 02:04amcheap viagara in order to cheapest viagra cheap viagra rx true an important saved authentic do the job, consequently high cheap viagra buy without prescription on real a higher amount cheap deal discount price viagra connected with peculiarly cheapest viagra online cheap viaga cheaper vigra viagra for sale cheap cheap viagra in us many factor many people in terms of iron cheap deal discount viagra
ReplyComment to Keyboard Message
Posted by Legacy on 10/13/2002 12:00amOriginally posted by: P.Kolodziej
Hi!
ReplyYou must replace message from WM_KEYDOWN to WM_SYSKEYDOWN for each messages in yours example.
How to retrive properties like Row data, Column data of MSflexGrid at runtime
Posted by Legacy on 01/28/2002 12:00amOriginally posted by: James
Could anybody tell me How to retrive properties like Row data, Column data of MSflexGrid at runtime .By any means
ReplyAbout Keybord Message
Posted by Legacy on 10/16/2001 12:00amOriginally posted by: Xuqing Bai
ReplyNot working except for WM_QUIT
Posted by Legacy on 08/24/2001 12:00amOriginally posted by: Krishnakumar
Hi,
Seems the program is working well, but can u tell me how shall I send a WM_KEYDOWN or WM_RBUTTONDOWM message to the same? I tried but its not working.. I mean the even though the PostMessage API returns true, nothing happens on the target window. Any help will be highly appreciated.
NB:My aim is to post a WM_KEYDOWN or WM_RBUTTONDOWM message to another window.
Regards,
krishnakumar
ReplyGreat Value.
Posted by Legacy on 08/23/2001 12:00amOriginally posted by: Sangyon
Could you recomand other VC++ site ?
Replyneat program!
Posted by Legacy on 08/23/2001 12:00amOriginally posted by: soichi
That is a very neat little program. I have discovered tons of hidden applications that win2000 automaticly runs and I simply didn't know.
I have a question for this ap. When you call ::EnumChildWindows(::GetDesktopWindow(), EnumWindowsProc, (LPARAM)this); what is the reason that you pass 'this' pointer to the EnumWindowProc? Since the proc is in the same dialog class, I just don't see why EnumWindowProc couldn't do this->m_hLastItem instead of (CPostMsgDlg*)lParam->m_hLastItem.
ReplyVery Useful as tool ... and just what I needed for timely controlling some applications ...
Posted by Legacy on 08/23/2001 12:00amOriginally posted by: Christiaan
Thanks, don't hesitate to mail me if you need something yourself as reward.
Reply