2008-10-14 5 views
2

Je le sous-classement d'une fenêtre native (le contrôle d'édition d'un combobox ...)En C#, j'ai un IntPtr à WIN32 WndProc. Quelle est la syntaxe pour l'appeler?

oldWndProc = SetWindowLong (HandleOfCbEditControl, GWL_WNDPROC, newWndProc);

Dans mon sous-classement wndproc, je vais avoir un code comme celui-ci, mais je n'arrive pas à comprendre la syntaxe pour appeler oldWndProc.

int MyWndProc(int Msg, int wParam, int lParam) 
    { 
     if (Msg.m == something I'm interested in...) 
     { 
       return something special 
     } 
     else 
     { 
       return result of call to oldWndProc <<<< What does this look like?*** 
     } 

    } 

EDIT: Le mot "subclassing" dans cette question fait référence au sens de l'API WIN32, pas C#. Sous-classer ici ne signifie pas remplacer le comportement de la classe de base .NET. Cela signifie que WIN32 appelle votre pointeur de fonction au lieu du rappel courant de Windows. Cela n'a rien à voir avec l'héritage en C#.

Répondre

2

Vous appelez CallWindowProc par P/Invoke. Il suffit de définir les paramètres comme int variables (comme on dirait que comment vous les avez définies dans l'appel SetWindowLong), donc quelque chose comme ceci:

[DllImport ("CallWindowProc" ...] extern public static int CallWindowProc (int previousProc, int nativeControlHandle, int msg, int lParam, int wParam).

Rappelez-vous que pour marshaling, int, uint et IntPtr sont tous identiques

+0

Avant d'appeler le proc par défaut, il veut appeler le proc utilisateur précédent pointé par oldWndProc. –

+0

Merci pour le conseil que int, uint et IntPtr sont tous identiques. J'ai appris cela en trébuchant avant de lire votre commentaire, mais votre commentaire est réconfortant que je faisais la bonne chose. –

+0

En fait, j'appelle la fonction WIN32 CallWindowProc –

0

Ce site sera très utile avec tous vos Interop/p-invoke efforts (SetWindowLong)

+0

J'ai compris la partie SetWindowLong. Je demandais comment appeler le winproc original. –

1

Vous devez utiliser CallWindowProc pour appeler ce pointeur oldWndProc

.
[DllImport("user32")] 
private static extern int CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, int Msg, int wParam, int lParam); 
Questions connexes