Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating custom message types in win32?

Is there a way to define and send custom message types in Win32, to be caught by your Main message handler? For example, my main message handler captures messages such as WM_PAINT, WM_RESIZE, WM_LBUTTONDOWN etc. Can I create my own WM_DOSOMETHING? If so, how would I send this message?

Ah, I actually just discovered this was asked before here, however, it doesn't answer how I would actually send this message.

like image 675
BeeBand Avatar asked Nov 29 '09 19:11

BeeBand


People also ask

What is the difference between SendMessage and PostMessage?

SendMessage: Sends a message and waits until the procedure which is responsible for the message finishes and returns. PostMessage: Sends a message to the message queue and returns immediately. But you don't know when that message is actually being processed.

What is SendMessage?

Sends the specified message to a window or windows. The SendMessage function calls the window procedure for the specified window and does not return until the window procedure has processed the message. To send a message and return immediately, use the SendMessageCallback or SendNotifyMessage function.

What is RegisterWindowMessage?

The RegisterWindowMessage function is typically used to register messages for communicating between two cooperating applications. If two different applications register the same message string, the applications return the same message value. The message remains registered until the session ends.

What are queued and non queued messages?

Message queues is used to route mouse and keyboard input to the appropriate window. Nonqueued messages are sent immediately to the destination window procedure, bypassing the system message queue and thread message queue.


3 Answers

Yes. Just declare a constant in the WM_USER range e.g.

#define WM_RETICULATE_SPLINES (WM_USER + 0x0001)

You can also register a message by name using the RegisterWindowMessage API.

You can then send these messages using SendMessage, PostMessage or any of their variants.

like image 144
itowlson Avatar answered Oct 12 '22 22:10

itowlson


Woah, let's just stop and think here...

First of all, Windows itself sends messages in the WM_USER+n range, that's why WM_APP was invented (I found this out the hard way). But it gets worse... there's nothing to stop badly behaved applications broadcasting WM_USER+n or WM_APP+n messages, and because human beings stole the crystal of infinite stupidity from the Gods, this does indeed happen in the real world.

So, repeat after me, the only safe message is one I define myself and can only see myself. Use RegisterWindowMessage. And even then, be untrusting. When I need a string to define a RegisterWindowMessage, I use GUIDGEN to create the string and put a human-readable app-specific prefix on the resulting gobbledygook to help me differentiate multiple messages in the code.

Bet on the stupidity of your fellow humans - it's always a winning bet.

If you want authoritative background on this whole topic, see here. No that's not my website, it's Joe Newcomer's.

like image 20
Bob Moore Avatar answered Oct 12 '22 21:10

Bob Moore


  • If you created the window class, you can use the WM_USER range (or WM_APP)
  • If it is not your class, you can use WM_APP
  • If you want to broadcast the message to every top level window, register your own global message with RegisterWindowMessage
like image 42
Anders Avatar answered Oct 12 '22 20:10

Anders