Click here to Skip to main content
Click here to Skip to main content
Go to top

How to make a Message Only Window

, 12 Aug 2004
Rate this:
Please Sign up or sign in to vote.
An article on how to make a message only window.

Introduction

An article on making a message only window class and why this is a useful thing to do.

Background

According to Microsoft:

A message-only window enables you to send and receive messages. It is not visible, has no z-order, cannot be enumerated, and does not receive broadcast messages. The window simply dispatches messages.

Simpler: You can send messages (PostMessage and SendMessage) to it. If you have a class which is derived from it, you can have it reacting to messages from other areas of code in a similar fashion to a normal window.

Benefits of using a message only window

  • Free queue for messages.

    What do you mean?

    If your system is message based from some sort of external IO say, and you are in need of a queuing facility, then your application can use PostMessage to post messages to the hidden window. These messages will be queued in the normal Windows message queue.

  • Inter/intra process communication

    What do you mean?

    Another part of your application (or an external application) can handle the arrival of these messages.

How do I make one?

It is pretty easy actually.

In the class that is to deal with the messages, follow this procedure:

  1. Make it inherit from CWnd, even if it means you multiply inherit.
    //
    class CMyMessageOnlyWindowClass : public CWnd
    //
  2. In the constructor or some other useful initialization type function, use the following code (change where needed).
    //
    CString wnd_class_name = ::AfxRegisterWndClass(NULL);
    BOOL created = this->CreateEx(0,wnd_class_name, 
        "CMyMessageOnlyWindowClass",0 ,0 ,0 ,0 ,0 ,HWND_MESSAGE,0);
    //
  3. Either register your own Windows message:
    const CString THIS_IS_MY_MESSAGE_STRING = "THIS_IS_MY_MESSAGE_STRING";
    const UINT MY_REGISTERED_MESSAGE = 
                            ::RegisterWindowMessage(THIS_IS_MY_MESSAGE_STRING);
  4. Or use something easier like:
    const UINT MY__MESSAGE = WM_USER+14;
  5. Create your message handling function in your .h and .cpp files.

    .h first

    afx_msg LRESULT DealWithMyRegisteredMsg(WPARAM wParam, LPARAM lParam);

    or

    afx_msg LRESULT DealWithMyMsg(WPARAM wParam, LPARAM lParam);

    Now, the cpp file

    LRESULT CMyMessageOnlyWindowClass::DealWithMyRegisteredMsg(WPARAM wParam, 
                                                                LPARAM lParam)
    { 
         AfxMessageBox("Chris is ready for a beer"); 
         return LRESULT(true); 
    }

    or

    LRESULT CMyMessageOnlyWindowClass::DealWithMyMsg(WPARAM wParam, 
                                                          LPARAM lParam)
    { 
         AfxMessageBox("Chris is ready for a beer"); 
         return LRESULT(true); 
    }
  6. Add the message map:
    BEGIN_MESSAGE_MAP(CMyMessageOnlyWindowClass, CWnd) 
         ON_REGISTERED_MESSAGE(MY_REGISTERED_MESSAGE, DealWithMyRegisteredMsg) 
         // or ON_MESSAGE(BLAH_MESSAGE,DealWithMyRegisteredMsg)
    END_MESSAGE_MAP()
  7. Now, go back to your .h file, and at the very end of your class - after all the functions and variables and so on (but before the “};”), – stick:

    DECLARE_MESSAGE_MAP()

    This says “I will be using a message map in my class” (well, we have just defined it).

  8. Now, when you want to post to this window, all you need is the handle to it…or a pointer to it, and you will find it should behave just like a normal window, only you can’t see it etc.

What else do I need to know?

  1. FindWindow: If you want to use FindWindow, you need to pay attention to the MSDN which says… "To find message-only windows, specify HWND_MESSAGE in the hwndParent parameter of the FindWindowEx function. In addition, FindWindowEx searches message-only windows as well as top-level windows if both the hwndParent and hwndChildAfter parameters are NULL."
  2. Multiple Inheritance: When multiply inheriting, the CWnd needs to come first, for example;
    class CMyMessageOnlyWindowClass : public CWnd, public COtherClass
  3. That's about it, remember: you can't view (see) this window!

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

Share

About the Author

bryce
Software Developer (Senior)
Australia Australia
No Biography provided

Comments and Discussions

 
GeneralMy vote of 3 Pinmemberpcpro1785-Nov-10 10:38 
GeneralUse "message" as window class up from Win2000 Pinmemberowmarr24-Nov-09 10:55 
GeneralRe: Use "message" as window class up from Win2000 PinmemberJohn Gonzalez25-Nov-09 9:25 
GeneralRe: Use "message" as window class up from Win2000 Pinmemberowmarr25-Nov-09 9:43 
GeneralAn ActiveX control PinmemberAlexEvans11-Jan-06 16:29 
Generalnon-MFC Message-Only window PinmemberDanLedford9-Dec-05 6:38 
Generalhello is it possible to check the ready state of the normal window and other applications Pinmember1lokii28-Dec-04 18:59 
GeneralAbout Destruction of Message Only Windows PinmemberVictor Ochoa3-Sep-04 9:44 
GeneralRe: About Destruction of Message Only Windows Pinmemberbryce3-Sep-04 14:29 
GeneralRe: About Destruction of Message Only Windows PinmemberVictor Ochoa4-Sep-04 8:40 
QuestionSubliminal message? PinadminChris Maunder30-Aug-04 3:27 
GeneralYou forgot to mention WINVER PinmemberNathan Holt at CCEI18-Aug-04 12:31 
GeneralRe: You forgot to mention WINVER Pinmemberbryce18-Aug-04 13:06 
GeneralRe: You forgot to mention WINVER (apology) PinmemberNathan Holt at CCEI18-Aug-04 13:47 
GeneralWM_USER Query PinmemberTom Brennan_aka_Irish_Wiz14-Aug-04 2:06 
Quick question - WM_USER has a defined list of messages up to a certain threshold which is reserved for Windows....Am I right in thinking that WM_USER+14 is not a safe message number?? If not I retract this question but highlight the importance of the fact that for user-defined messages it must be above the range reserved for Windows....Good article by the way! Wink | ;-)
 
Best Regards,
Tom.
GeneralRe: WM_USER Query PinmemberRavi Bhavnani14-Aug-04 5:58 
GeneralRe: WM_USER Query PinmemberNathan Holt at CCEI18-Aug-04 4:50 
Generalquestion PinmemberTodd Smith13-Aug-04 7:44 
GeneralNice! PinmemberRavi Bhavnani13-Aug-04 3:01 

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web03 | 2.8.140916.1 | Last Updated 13 Aug 2004
Article Copyright 2004 by bryce
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid