任何人都可以告诉我,我在片段中犯了错误

public partial class Form1 : Form { [DllImport("coredll.dll")] static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); const int GWL_WNDPROC = -4; public delegate int WindProc(IntPtr hWnd, uint msg, long Wparam, long lparam); public Form1() { InitializeComponent(); WindProc SampleProc = new WindProc (SubclassWndProc); SetWindowLong(this .Handle , GWL_WNDPROC, SampleProc.Method .MethodHandle.Value.ToInt32()); } public int SubclassWndProc(IntPtr hwnd, uint msg, long Wparam, long lparam) { return 1; } 

这是我试图采用窗体过程的示例,这就是我在C ++中的操作,如果我在C#中尝试相同的话,我可以轻松获得windwproc。我无法获得窗口proc,之后调用SetWindowLong API应用程序挂起,它弹出一些不发送报告…我已经读过这是获取窗口proc的方法..请让我知道我在犯错误…

SampleProc.Method .MethodHandle.Value.ToInt32()

只需使用SampleProc 。 如果失败,请尝试将其编组到FunctionPointer

委托实例不需要是静态的。 不知道为什么你认为它应该。

我认为您需要在表单级别声明您的委托实例,如下所示:

 public partial class Form1 : Form { [DllImport("coredll.dll")] static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); const int GWL_WNDPROC = -4; public delegate int WindProc(IntPtr hWnd, uint msg, long Wparam, long lparam); private WindProc _SampleProc; public Form1() { InitializeComponent(); _SampleProc = new WindProc(SubclassWndProc); SetWindowLong(this.Handle, GWL_WNDPROC, _SampleProc.Method.MethodHandle.Value.ToInt32()); } public int SubclassWndProc(IntPtr hwnd, uint msg, long Wparam, long lparam) { return 1; } 

您的原始委托实例正在表单的构造函数中声明,它立即超出范围(因此不再被调用回来)。

您的样本也可能存在其他问题。

你正在使用紧凑的框架,对吗? 你是在做同样的过程吗?

如果创建窗口的过程与消息源自的过程不同,我自己也遇到过这种麻烦。 但是我主动使用SendMessage发送消息。 如果我是通过其他流程完成此操作,则会收到“发送错误报告”页面。 我现在已经发现,如果SendMessage来自同一个进程,那么事情就可以了。

在上面你可能用线程替换进程,虽然我不确定。