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

时间:2009-09-23 13:05:04

标签: c# .net-3.5 windows-mobile compact-framework

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的方法..请让我知道我在犯错误...

4 个答案:

答案 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来自同一个进程,那么事情就可以了。

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