Вопрос

Я успешно использовал метод 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 для этих значений.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top