【问题标题】: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 后应用程序挂起并弹出一些不发送报告...我已经阅读了这是获取窗口过程的方法.. 请让我知道我是否犯了错误...

【问题讨论】:

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


    【解决方案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 来自同一个进程,那么一切正常。

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

      【讨论】:

      • 嗯,没有。答案已经给出并被接受。他错误地使用了代理。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      相关资源
      最近更新 更多