Pregunta

He utilizado con éxito el método SendMessage de Windows para ayudarme a hacer varias cosas en mi editor de texto, pero cada vez copio y pego el código sugerido por otros, y realmente no sé qué significa. Siempre hay un número de mensaje críptico que es un parámetro. ¿Cómo puedo saber qué significan estos números de código para poder entender realmente lo que está sucediendo y (con suerte) ser un poco más autosuficientes en el futuro? Gracias.

Ejemplo reciente:

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));
¿Fue útil?

Solución

Este es el código de mensaje de Windows.
Se definen en los archivos de encabezado y, por lo general, están traducidos como una inclusión de algún tipo con diferentes idiomas.

ejemplo:
WM_MOUSEMOVE = & amp; H200
MK_CONTROL = & amp; H8
MK_LBUTTON = & amp; H1
MK_MBUTTON = & amp; H10
MK_RBUTTON = & amp; H2
MK_SHIFT = & amp; H4
MK_XBUTTON1 = & amp; H20
MK_XBUTTON2 = & amp; H40

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

Otros consejos

Cada mensaje en Windows está indicado por un número. Cuando se codifica utilizando el SDK de Windows en código nativo, estos se proporcionan mediante definiciones como WM_CHAR, WM_PAINT o LVM_GETCOUNT, pero estas definiciones no se transfieren al marco de trabajo .NET porque, en su mayor parte, los mensajes están envueltos por eventos .NET como OnKeyPressed y OnPaint, o métodos y propiedades como ListView.Items.Count.

En el caso de que no haya un evento, propiedad o método envuelto, o si necesita hacer algo que no sea compatible en el nivel superior, necesita los números de mensaje que Windows usa debajo del marco .NET.

La mejor manera de averiguar qué significa realmente un número en particular es buscar en los encabezados del SDK de Windows y encontrar la definición para ese número.

Tal vez encuentre el código en http://www.codeproject.com /KB/cs/cswindowsmessages.aspx útil. Proporciona una enumeración de C # de muchos mensajes de Windows comunes.

Entre todos los ejemplos que encontré en Internet, este es el mejor porque es el único que se encarga de mostrar el utilizando System.Runtime.InteropServices . Sin esta directiva no podría tener SendMessage trabajando en c #. También es muy útil la lista de mensajes de Windows que ofrece esta página. Aquí repito el ejemplo:

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

Pruebe el Asistente de interoperabilidad de PInvoke . Esta herramienta tiene una funcionalidad de búsqueda que le permite navegar a través de todos los mensajes de Windows definidos. Entonces generará el código C # / VB.Net correcto para esos valores.

Tampoco se limita a valores constantes. También puede generar estructuras, funciones, punteros de función y enumeraciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top