2010-03-29 12 views
6

Sto tentando di estendere il controllo TextBox per aggiungere funzionalità di filigrana. L'esempio che ho trovato su CodeProject sta usando la funzione SendMessage importata.SendMessage vs. WndProc

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); 

void SetWatermark() 
{ 
    SendMessage(this.Handle, 0x1501, 0, "Sample"); 
} 

mi chiedo perché non utilizzare protetto WndProc invece

void SetWatermark() 
{ 
    var m =new Message() { HWnd = this.Handle, Msg = 0x1501, WParam = (IntPtr)0, LParam = Marshal.StringToHGlobalUni("Sample") }; 
    WndProc(ref m); 
} 

Entrambi sembrano funzionare bene. Quasi tutti gli esempi che ho visto su Internet utilizzano la funzione SendMessage. Perché? La funzione non è WndProc progettata per sostituire SendMessage?

P.S. Non conosco il diritto di convertire string in IntPtr e ho trovato che Marshal.StringToHGlobalUni funziona correttamente. È giusta la funzione per fare questo?

risposta

11

WndProc non sostituisce SendMessage, è l'equivalente .NET di WindowProc. WndProc viene chiamato dal pump dei messaggi dell'applicazione (che riceve i messaggi inviati o inviati da SendMessage o PostMessage) per elaborarli. Chiamando direttamente WndProc, si bypassa la gestione speciale dei messaggi eseguita da Windows, ad esempio il raggruppamento dei messaggi WM_PAINT, e può potenzialmente causare alcuni problemi in cui i messaggi vengono visualizzati nell'ordine in cui sono previsti da Windows all'interno dell'applicazione.

Come indicato nel MSDN,

Tutti i messaggi vengono inviati al metodo di WndProc dopo essere stato filtrato attraverso il metodo PreProcessMessage.

Il metodo WndProc corrisponde esattamente a alla funzione WindowProc di Windows. Per ulteriori informazioni sull'elaborazione dei messaggi di Windows , vedere la documentazione relativa a WindowProc nella libreria MSDN allo http://msdn.microsoft.com/library.

Chiamando direttamente, si priva il sistema di una possibilità di eseguire la pre-elaborazione o qualsiasi altra gestione di tale messaggio. Il framework .NET gira su Windows e senza inviare o postare il messaggio, il sistema sottostante non può fare nulla con quel messaggio, quindi perdi tutto ciò che il sistema sottostante potrebbe fare per te.

Problemi correlati