2015-05-21 11 views
10

Mi sono guardato intorno e non ho visto molte informazioni sul motivo per cui qualcuno avrebbe ignorato wndproc per gestire i messaggi.Perché dovresti eseguire l'override di wndproc

Quindi mi chiedo:

Perché farlo?

Quando farlo?

Qual è lo scopo generale in C#?

Ho provato a utilizzarlo quando ho visto una seria seriale collegata e scollegata dal computer, ma mi sono sentito come se fossi riuscito a fare affidamento sui metodi che ho creato io stesso.

Altri messaggi che vedo sono per i tasti premuti, le impostazioni del cursore e altre varie azioni. Detto questo, molte di queste cose hanno già incorporato metodi nelle librerie C#. Quindi di nuovo sono tornato alle mie tre domande principali. Qualsiasi informazione, opinione, esempio, ecc. Sarebbe fantastico.

+0

Questa domanda è stata referenziata su meta: https://meta.stackoverflow.com/a/295041/3614835 –

risposta

12

WndProc() è molto, molto essenziale per il funzionamento di una finestra di Windows. Si tratta di un metodo di wrapper gestito attorno alla procedura della finestra , una funzione che una volta veniva scritta in C nei giorni precedenti. È il modo in cui si personalizza il comportamento di una finestra, facendolo rispondere in modo diverso alle notifiche generate dal sistema operativo o da altri programmi.

In genere non è necessario sovrascriverlo, il metodo WndProc() nella classe base gestisce la maggior parte delle notifiche di base. Trasformandoli in eventi .NET amichevoli, come Click ecc. Ma non è completo, perché la notifica è troppo oscura o necessariamente perché non può sapere nulla dei messaggi usati da una finestra personalizzata. In tal caso, puoi ricorrere a WndProc() per intercettare il messaggio. Il miglior esempio che mi viene in mente è la creazione di una finestra senza bordi per disegnare una cornice della finestra personalizzata e mantenere comunque il normale comportamento della finestra. Più facilmente fatto intercettando messaggi come WM_NCHITTEST, non inclusi da .NET.

Davvero grokking WndProc() richiede la lettura del libro di Petzold "Programmazione di Windows". Forse non è così facile da cogliere oggi, presuppone una comprensione di base del linguaggio C. Quale era la lingua designata da Winapi 30 anni fa, i linguaggi object oriented non erano ampiamente usati o disponibili a quei tempi. Ciò inoltre spiega perché scrivere codice all'interno di WndProc() è piuttosto doloroso, c'è un'astrazione molto piccola e non si possono ignorare i puntatori.

Microsoft ha fatto uno sforzo per ritirarlo, a partire da Windows 8 e l'API WinRT. Non esattamente un successo slamdunk, forse Windows 10 gli darà una certa trazione. La tecnologia fondamentale che fa funzionare WinRT è COM, un grande passo avanti rispetto a C perché supporta un modello di oggetti. Sebbene sia ben nascosto nelle proiezioni linguistiche amichevoli, la programmazione COM è qualcosa che la maggior parte dei programmatori cercheranno di evitare :)

0

Ho trovato che è utile per elaborare gli eventi di keypress per un UserControl.

Gli eventi keypress, keyDown o KeyUp sono piuttosto complessi nel rispondere da un UserControl (anche se KeyPreview è impostato su true e tutto il resto). Ho scoperto che se sovrascrivo WndProc() ho molta più affidabilità del controllo che elabora il comando.

Problemi correlati