Объяснение номеров сообщений SendMessage?

Я успешно использовал метод Windows SendMessage, чтобы помочь мне делать разные вещи в текстовом редакторе, но каждый раз, когда я просто копирую и вставляю код, предложенный другими, и я действительно не знаю, что это значит. Всегда есть номер загадочного сообщения, являющийся параметром. Откуда я знаю, что означают эти коды, чтобы я мог понять, что происходит и (надеюсь) будет немного более самодостаточным в будущем? Спасибо.

Недавний пример:

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));

Ответы

Ответ 1

Это код сообщения Windows.
Они определены в файлах заголовков и, как правило, доступны, как переведенные как отдельные типы с разными языками.

Пример:
WM_MOUSEMOVE = & H200
MK_CONTROL = & H8
MK_LBUTTON = & H1
MK_MBUTTON = & H10
MK_RBUTTON = & H2
MK_SHIFT = & H4
MK_XBUTTON1 = & H20 - MK_XBUTTON2 = & H40

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

Ответ 2

Каждое сообщение в Windows обозначается числом. При кодировании с использованием SDK Windows в собственном коде они предоставляются с помощью таких определений, как WM_CHAR, WM_PAINT или LVM_GETCOUNT, но эти определения не переносятся на платформу .NET, поскольку в большинстве случаев сообщения обертываются событиями .NET как OnKeyPressed и OnPaint, или методы и свойства, такие как ListView.Items.Count.

В случае, когда нет завернутого события, свойства или метода или вам нужно сделать что-то, что не поддерживается на более высоком уровне, вам нужны номера сообщений, которые Windows использует под платформой .NET.

Лучший способ узнать, что на самом деле означает конкретное число, - это посмотреть в заголовки SDK Windows и найти определение для этого номера.

Ответ 3

Возможно, вы найдете код http://www.codeproject.com/KB/cs/cswindowsmessages.aspx полезным. Он предоставляет перечисление С# для многих распространенных сообщений Windows.

Ответ 4

Среди всех примеров, которые я нашел в Интернете, это один из лучших, потому что он единственный, кто заботится о показе using System.Runtime.InteropServices. Без этой директивы я не мог бы SendMessage работать в С#. Также очень полезен список сообщений Windows на этой странице. Здесь я повторяю пример:

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)); 

Ответ 5

Попробуйте PInvoke interop Assistant. Этот инструмент имеет функцию поиска, которая позволяет просматривать все определенные сообщения Windows. Затем он генерирует правильный код С#/VB.Net для этих значений.

Он также не ограничивается только постоянными значениями. Он также может генерировать структуры, функции, указатели на функции и перечисления.