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。我无法获得窗口过程,在调用SetWindowLong API应用程序挂起后,它弹出一些不发送报告...我已经读过这是获取窗口proc的方法..请让我知道我在犯错误...
答案 0 :(得分:3)
SampleProc.Method .MethodHandle.Value.ToInt32()
只需使用SampleProc
即可。如果失败,请尝试将其编组为FunctionPointer
。
答案 1 :(得分:1)
委托实例不需要是静态的。不知道为什么你认为它应该。
答案 2 :(得分:0)
我认为您需要在表单级别声明您的委托实例,如下所示:
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;
}
您的原始委托实例正在表单的构造函数中声明,它立即超出范围(因此不再被调用回来)。
您的样本可能还有其他问题。
答案 3 :(得分:0)
您正在使用紧凑型框架,对吗?你是在做同样的过程吗?
如果创建窗口的过程与消息源自的过程不同,我自己也遇到过这种麻烦。但是我主动使用SendMessage发送消息。如果我是通过其他流程完成此操作,则会收到“发送错误报告”页面。我现在已经发现,如果SendMessage来自同一个进程,那么事情就可以了。
在上面你可能用线程替换进程,虽然我不确定。