Объяснение номеров сообщений SendMessage? - PullRequest
14 голосов
/ 16 октября 2008

Я успешно использовал метод 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));

Ответы [ 5 ]

3 голосов
/ 16 октября 2008

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

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

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

3 голосов
/ 16 октября 2008

Это код сообщения 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 голосов
/ 22 января 2010

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

1 голос
/ 22 марта 2010

Среди всех примеров, которые я нашел в Интернете, этот является лучшим, потому что он единственный, который заботится о показе 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)); 
0 голосов
/ 16 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...