Объяснение номеров сообщений 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 для этих значений.
Он также не ограничивается только постоянными значениями. Он также может генерировать структуры, функции, указатели на функции и перечисления.