谁能告诉我我在片段中犯了错误
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 来自同一个进程,那么一切正常。
在上面你可能会用线程替换进程,虽然我不确定。
【讨论】:
嗯,没有。答案已经给出并被接受。他错误地使用了代理。以上是关于谁能告诉我我在片段中犯了错误的主要内容,如果未能解决你的问题,请参考以下文章