在C#中,我有一个到WIN32 WndProc的IntPtr。 调用它的语法是什么?

我是子类化本机窗口(combobox的编辑控件……)

oldWndProc = SetWindowLong(HandleOfCbEditControl,GWL_WNDPROC,newWndProc);

在我的子类wndproc中,我会有这样的代码,对,但我无法弄清楚调用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?*** } } 

编辑:此问题中的“子类化”一词是指WIN32 API的含义,而不是C#。 这里的子类化并不意味着重写.NET基类行为。 这意味着告诉WIN32调用你的函数指针而不是windows当前回调。 它与C#中的inheritance无关。

你将通过P / Invoke调用CallWindowProc 。 只需将参数定义为int变量(因为它看起来就像你在SetWindowLong调用中定义的那样),所以像这样:

[DllImport(“CallWindowProc”…] public static extern int CallWindowProc(int previousProc,int nativeControlHandle,int msg,int lParam,int wParam);

请记住,对于编组,int,uint和IntPtr都是相同的。

您应该使用CallWindowProc来调用oldWndProc指针。

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

这个站点对你的所有interop / p-invoke工作非常有帮助( SetWindowLong )