Click here to Skip to main content
Click here to Skip to main content

MessageSender

By , 24 Aug 2004
 
Screenshot - MessageSender.jpg

Introduction

It may be desirable sometimes (for instance, for testing purposes) to send a message to a window of some application. Initially, MessageSender was created just for sending such messages, normally WM_USER + XXX or WM_APP + XXX or some system messages not containing pointers. Later, I added a few more features such as context and time customization. A few messages, such as WM_SETTEXT and WM_SETFONT, can also be customized. Their list is not so long though; I did it just for my favorite ones.

Settings and Operations

  • Window Selection

    You can provide the handle of a window or its title and class. Alternatively, you can use a window-finding tool thanks to Lim Bio Liong and his article MS Spy++ style Window Finder. Also, you can navigate along next/previous or parent/first child windows.

  • Message Selection

    Enter message code (hex) or select a message from the list, specifying their wParam and lParam. For a few messages, you can customize their parameters in a more natural way. It is especially useful for those whose values should be pointers. See, for instance, WM_SETTEXT or WM_SETFONT.

  • Sending Method

    You can select among the SendMessage(), PostMessage() and SendMessageTimeout() functions to send a message.

  • Context

    Some messages cannot be sent to windows from a different thread. If target window thread context is selected, MessageSender first installs a hook on the target window, injecting msgsndr.dll to its process address space. During the first call to the hook function, a new hidden window will be created in the target thread context. This window will serve as a medium while sending messages. Namely, MessageSender will pack an original message and send it packed using WM_COPYDATA to that hidden window. Then the window procedure unpacks it and forwards to its target. Note that the last steps will be performed not in MessageSender, but in the target thread context.

  • Time Values

    Normally messages will be sent once, as soon as you press the "Send it!" button. By specifying correspondent values, you can do it later or a few times in a chain.

Using the Code

I hope that the code is more or less self-explanatory. The workspace contains two projects, MessageSender (EXE) and msgsndr (injecting DLL). The main application dialog is CMessageSenderDlg (files: MessageSenderDlg.cpp and MessageSenderDlg.h).

It is possible that you would like to add customization for more messages. To protect my code from frequent changes, I derived CSendMessageDialog (files: SendMessageDialog.h and SendMessageDialog.cpp) from CMessageSenderDlg. Implement accordingly some or all of its functions:

class CSendMessageDialog : public CMessageSenderDlg
{
    ...
    protected:
    // TODO: add members keeping message specific values here
    // TODO: implement accordingly some or all next functions to customize
    // a message
    virtual void  AddConstantsToCombo();
        // called from IniConstListCombo()
    virtual void MessageChanged(UINT unMessage);
        // called from OnChangeEditMessage()
    virtual void CustomizeMessage(UINT unMessage);
        // called from OnButtonCustomize()
    virtual void PreSendMessage(SendingMessage*);
        // called from OnButtonSend()
    virtual void PrepareMessageLocal(SendingMessage*);
        // called from SendMsgLocalContext()
    virtual CString DisplayMessageLocalResults(SendingMessage*);
        // called from SendMsgLocalContext()
    virtual void PrepareMessageTarget(SendingMessage*);
        // called from SendMsgTargetContext()
    virtual CString DisplayMessageTargetResults(SendingMessage*);
        // called from SendMsgTargetContext()
}

In addition, add necessary code to InsertedDialogProc() in the DLL (file: msgsndr\msgsndr.cpp). I have marked correspondent places by TODO comments. If you do this job, please do not forget to send me a copy!

Warning

Sending some messages may cause unpredictable results. Target applications may stop working properly and you can lose some data. It is recommended to close all applications but the one you're testing.

History

Sep 2, 2003

  • Initial public release

Sep 9, 2003

  • "Find window" tool is now able to catch more windows, including disabled and hidden child windows.
  • Navigation along next/previous or parent/first child windows was added.
  • Message processing result is now available in both local (i.e. MessageSender) and target window thread context.

Aug 23, 2004

  • Information about thread / process / path to the executable file (the latter is not available under Windows NT).
  • Possibility to navigate back and forth through already found windows.
  • Main window is automatically reduced in size while using the "Find window" tool.

Aug 20, 2007

  • WM_COPYDATA message can now be customized and sent from MessageSender thread context.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Dmytro Ivanchykhin
Ukraine Ukraine
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Questioninfected exe?membermaltwhiskman25 Aug '10 - 21:13 
at least one AV package says it is infected with Worm.Palevo-9668
AnswerRe: infected exe?memberDmytro Ivanchykhin26 Aug '10 - 22:33 
GeneralRe: infected exe?membermaltwhiskman30 Jun '11 - 17:57 
QuestionHow to send a pointer to a data?memberehaerim4 Jun '10 - 22:18 
AnswerRe: How to send a pointer to a data?memberDmytro Ivanchykhin7 Jun '10 - 10:34 
QuestionHow to send WM_COPYDATA with a string?memberehaerim17 Aug '07 - 22:51 
AnswerRe: How to send WM_COPYDATA with a string?memberDmytro Ivanchykhin18 Aug '07 - 3:00 
GeneralRe: How to send WM_COPYDATA with a string?memberehaerim18 Aug '07 - 3:23 
AnswerWM_COPYDATA customization added ...memberDmytro Ivanchykhin20 Aug '07 - 8:18 
GeneralRe: WM_COPYDATA customization added ...memberehaerim18 Oct '08 - 6:05 
Generalthe bestmemberDgMv30 Apr '06 - 12:44 
QuestionHow do I send special characters ?membersanskypotov19 Aug '04 - 21:15 
AnswerRe: How do I send special characters ?memberDmytro Ivanchykhin21 Aug '04 - 11:23 
GeneralExcellentmemberBrian Delahunty25 Sep '03 - 2:04 
GeneralVery cool!memberChris Richardson11 Sep '03 - 15:00 
GeneralExcellentmemberSimon Hughes8 Sep '03 - 23:21 
GeneralRe: Excellentmembersuper_virus_future30 Dec '08 - 0:12 
Generalgood...memberKRS-SSD8 Sep '03 - 3:19 
GeneralUHU,,,,memberSnyp5 Sep '03 - 12:45 
GeneralExcellentmemberBinarygb5 Sep '03 - 2:51 
GeneralAwesome Toolmemberlordelectro4 Sep '03 - 8:48 
GeneralWoW!!!memberCaio Proiete3 Sep '03 - 14:42 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 25 Aug 2004
Article Copyright 2003 by Dmytro Ivanchykhin
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid