views:

3602

answers:

5

I've successfully used the Windows SendMessage method to help me do various things in my text editor, but each time I am just copying and pasting code suggested by others, and I don't really know what it means. There is always a cryptic message number that is a parameter. How do I know what these code numbers mean so that I can actually understand what is happening and (hopefully) be a little more self-sufficient in the future? Thanks.

Recent example:

using System.Runtime.InteropServices;

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, uint wMsg,UIntPtr wParam, IntPtr lParam);

SendMessage(myRichTextBox.Handle, (uint)0x00B6, (UIntPtr)0, (IntPtr)(-1));
+2  A: 

This is the windows message code.
They are defined in the header files, and generally available translated as an include of some sort with different languages.

example:
WM_MOUSEMOVE = &H200
MK_CONTROL = &H8
MK_LBUTTON = &H1
MK_MBUTTON = &H10
MK_RBUTTON = &H2
MK_SHIFT = &H4
MK_XBUTTON1 = &H20
MK_XBUTTON2 = &H40

see http://msdn.microsoft.com/en-us/library/ms644927(VS.85).aspx#windows_messages.

François
+3  A: 

Each message in Windows is signified by a number. When coding using the Windows SDK in native code, these are provided by defines such as WM_CHAR, WM_PAINT, or LVM_GETCOUNT, but these defines are not carried over to the .NET framework because in the most part, the messages are wrapped by .NET events like OnKeyPressed and OnPaint, or methods and properties like ListView.Items.Count.

On the occasion where there is no wrapped event, property or method, or you need to do something that isn't supported at the higher level, you need the message numbers that Windows uses underneath the .NET framework.

The best way to find out what a particular number actually means is to look in the Windows SDK headers and find the definition for that number.

Jeff Yates
A: 

Try out the PInvoke interop Assistant. This tool has a search functionality that allows you to browse through all of the defined windows messages. It will then generate the correct C#/VB.Net code for those values.

It's also not limited to just constant values. It can also generated structs, functions, function pointers and enums.

JaredPar
+1  A: 

Maybe you'll find the code at http://www.codeproject.com/KB/cs/cswindowsmessages.aspx useful. It provides a C# enumeration of many common windows messages.

cdiggins
if you cut+paste from somewhere, it's good to also credit the source
Ben Voigt
+1  A: 

Among all the examples I search in the internet, this one is the best because is the only one that take care of showing the "using System.Runtime.InteropServices". Without this directive I could not have SendMessage working in c#. Also very helpfull is the list of Windows Messages this page offer. Thank you for you help. Here I repeat the example:

using System.Runtime.InteropServices;

[DllImport("user32.dll")] static extern int SendMessage(IntPtr hWnd, uint wMsg,UIntPtr wParam, IntPtr lParam);

SendMessage(myRichTextBox.Handle, (uint)0x00B6, (UIntPtr)0, (IntPtr)(-1));

Pedro