谁能告诉我我在片段中犯了错误

Posted

技术标签:

【中文标题】谁能告诉我我在片段中犯了错误【英文标题】:Can anyone tell me were I am making mistake in the snippet 【发布时间】:2010-11-30 18:05:14 【问题描述】:
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# .net 3.5 中尝试相同的操作,我很容易获得windwproc,我无法获得窗口过程,, 调用 SetWindowLong API 后应用程序挂起并弹出一些不发送报告...我已经阅读了这是获取窗口过程的方法.. 请让我知道我是否犯了错误...

【问题讨论】:

【参考方案1】:

SampleProc.Method .MethodHandle.Value.ToInt32()

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

【讨论】:

不,我不能简单地给出 SampleProc 它不会工作,我不知道将它编组为 FunctionPointer.. 请详细告诉我.. 这会很有帮助 为什么它不起作用?请告诉我。我已经使用了很多委托,就像我说的那样。 我不知道,但这将是我收到的错误 CS1503: Argument '3': cannot convert from 'UnsafeCodeSample.Form1.WindProc' to 'int' Hey Leppie...如何将其编组为 FunctionPointer 我对编组不太了解.. 如果您知道请给我一些示例或 sn-p。 Lippie 它起作用了.. 我只是将函数指针编组为如此简单的“Marshal .GetFunctionPointerForDelegate (SampleProc)”:-)。非常感谢你..非常感谢您的回答【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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;
    

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

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

【讨论】:

无论哪种方式,委托都需要一个实例。您需要将委托实例声明为静态。 @leppie:我认为委托实例不需要是静态的。 No yaar ..我试过它没有用..如果我犯错了请告诉我..如果它有效,大头痛得到解决,请帮助.. @MusiGenesis:我们会看到的! :) 有时间会测试的。 @Leppie deligate 的静态实例也给出了同样的问题.. 我不知道为什么 :-(.. 无论如何请让我知道问题..【参考方案4】:

您正在使用紧凑型框架,对吗?您是否在同一个流程中做所有事情?

我自己也遇到过这种麻烦,如果创建窗口的进程与消息来源的进程不同。但是我积极地使用 SendMessage 来发送消息。如果我从不同的进程执行此操作,我会得到“发送错误报告”页面。我现在发现,如果 SendMessage 来自同一个进程,那么一切正常。

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

【讨论】:

嗯,没有。答案已经给出并被接受。他错误地使用了代理。

以上是关于谁能告诉我我在片段中犯了错误的主要内容,如果未能解决你的问题,请参考以下文章

viewpager 中的片段,未找到视图错误

如何处理 ViewModel 中的配置更改

realloc:invalid next size 错误,谁能指出我在内存分配中犯的错误

从片段类中的对话框添加项目到recyclerview。

片段中的自定义列表适配器

如何在 Unity 中添加 Google Play 游戏注册脚本