Объяснение номеров сообщений 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));
Решение
Это код сообщения 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.
Другие советы
Каждое сообщение в Windows обозначается числом.При кодировании с использованием Windows SDK в собственном коде они предоставляются такими определениями, как WM_CHAR, WM_PAINT или LVM_GETCOUNT, но эти определения не переносятся в .NET Framework, поскольку по большей части сообщения обертываются событиями .NET. например OnKeyPressed и OnPaint, или методы и свойства, такие как ListView.Items.Count.
В тех случаях, когда нет обернутого события, свойства или метода или вам нужно сделать что-то, что не поддерживается на более высоком уровне, вам нужны номера сообщений, которые Windows использует в рамках .NET framework.
Лучший способ узнать, что на самом деле означает конкретное число, — просмотреть заголовки Windows SDK и найти определение этого числа.
Возможно, вы найдете код на http://www.codeproject.com/KB/cs/cswindowsmessages.aspx полезный.Он обеспечивает перечисление C# многих распространенных сообщений Windows.
Среди всех примеров, которые я нашел в Интернете, этот — лучший, потому что только он демонстрирует суть using System.Runtime.InteropServices
.Без этой директивы я не смог бы заставить SendMessage работать на C#.Также очень полезен список сообщений 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));
Попробуйте Помощник по взаимодействию PInvoke.Этот инструмент имеет функцию поиска, которая позволяет просматривать все определенные сообщения Windows.Затем он сгенерирует правильный код C#/VB.Net для этих значений.
Это также не ограничивается только постоянными значениями.Он также может генерировать структуры, функции, указатели на функции и перечисления.