Domanda

Ho usato con successo il metodo SendMessage di Windows per aiutarmi a fare varie cose nel mio editor di testo, ma ogni volta sto solo copiando e incollando il codice suggerito da altri, e non so davvero cosa significhi. C'è sempre un numero di messaggio criptico che è un parametro. Come faccio a sapere cosa significano questi numeri di codice in modo da poter effettivamente capire cosa sta succedendo e (si spera) essere un po 'più autosufficiente in futuro? Grazie.

Esempio recente:

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));
È stato utile?

Soluzione

Questo è il codice del messaggio di Windows.
Sono definiti nei file di intestazione e generalmente disponibili tradotti come inclusione di qualche tipo con lingue diverse.

Esempio:
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

vedi http://msdn.microsoft .com / it-it / library / ms644927 (VS.85) aspx # windows_messages .

Altri suggerimenti

Ogni messaggio in Windows è indicato da un numero. Quando si codifica utilizzando Windows SDK nel codice nativo, questi sono forniti da definizioni come WM_CHAR, WM_PAINT o LVM_GETCOUNT, ma queste definizioni non vengono trasferite al framework .NET perché nella maggior parte dei casi, i messaggi sono racchiusi da eventi .NET come OnKeyPressed e OnPaint o metodi e proprietà come ListView.Items.Count.

Nel caso in cui non vi siano eventi, proprietà o metodi incorporati o è necessario fare qualcosa che non è supportato al livello superiore, sono necessari i numeri dei messaggi che Windows utilizza sotto il framework .NET.

Il modo migliore per scoprire cosa significa effettivamente un determinato numero è cercare nelle intestazioni di Windows SDK e trovare la definizione per quel numero.

Forse troverai il codice su http://www.codeproject.com /KB/cs/cswindowsmessages.aspx utile. Fornisce un elenco C # di molti messaggi Windows comuni.

Tra tutti gli esempi che ho trovato su Internet, questo è il migliore perché è l'unico che si occupa di mostrare il usando System.Runtime.InteropServices . Senza questa direttiva non avrei potuto far funzionare SendMessage in c #. Molto utile è anche l'elenco dei messaggi di Windows che questa pagina offre. Qui ripeto l'esempio:

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

Prova PInvoke interop Assistant . Questo strumento ha una funzionalità di ricerca che ti consente di sfogliare tutti i messaggi di Windows definiti. Quindi genererà il codice C # / VB.Net corretto per tali valori.

Inoltre, non è limitato ai soli valori costanti. Può anche generare strutture, funzioni, puntatori di funzioni ed enumerazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top