postmessage()接收c#时的事件
本文关键字:事件 接收 postmessage | 更新日期: 2023-09-27 17:53:32
我有一个非托管DLL与delphi和集成有一些事件,在运行时的某些点触发。在它的手册上说它调用Win32 api PostMessage()
。
当事件被触发时,发送一条文本消息,wParam和IParam有一些其他信息。
我怎么能从我的c#应用程序触发一个事件时,从dll的消息发布,当然得到的信息?
更新:试着描述手册的内容:所以我有一个名为init()的函数,它接受我传递的句柄参数,如下所示:
wr.Init((IntPtr)this.Handle);
从c# Winform应用程序到非托管dll返回true,如果它是好的,这就是我所看到的。
手册上写着:
当事件(来自dll)被触发时,它发送一个windows消息到与Init函数一起提供的窗口句柄,实际上PostMessage() Win32 API被调用。
我有在PostMessage()上发送的消息列表,例如:
TextMessage: WM_TECH_BROKENLINE
wParam: Point (which is a number displaying for example where is broken)
IParam: 0
现在,正如我所解释的,我希望当像上面这样的消息从dll发布时,我从c#中触发一个事件,当然得到文本消息和参数
必要的步骤如下:
- 在你的c#程序中获取一个窗口句柄。
- 将该窗口句柄传递给非托管DLL,以便它知道将消息发送到哪里。
- 在你的c#代码中,添加代码来接收和响应到达的消息。
作为上述方法的替代方法,您可能更喜欢将程序的GUI窗口与此消息传递机制分开。在这种情况下,执行以下操作:
- 创建
NativeWindow
的子类来处理传入消息。 - 创建类的实例,并将其窗口句柄传递给非托管DLL。
- 覆盖
WndProc
在您的窗口类,然后处理那里的消息。此时你可以将其作为事件呈现。
后一种方法可以更好地将您的互操作代码与GUI分离,并允许您使包装器与GUI的纠缠更少。
为了更详细地描述这些,你需要知道你的程序的细节。例如,它是WinForms还是WPF?您的程序是否有一个接收消息的窗口?字符串是如何编码的?在哪个消息参数中到达?如果消息是异步传递的,那么字符串的内存是如何释放的?
我怀疑你会有这些问题的一些答案,但也许不是全部。现在您大致知道了需要做什么,但是现在需要为您自己的程序找到更多的细节。
尝试覆盖您传递给dll的句柄的表单的WndProc
方法。示例如下:https://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc(v=vs.110).aspx
您的案例的简化示例(将其添加到表单类中):
const int WM_TECH_BROKENLINE = 0x0401; // It's WM_USER + 1 in my example.
// Set it according to you dll's spec
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_TECH_BROKENLINE)
{
long dataPassedFromTheDll = (long)m.WParam;
// Your stuff here:
this.Text = string.Format("The dll sent us: {0}", dataPassedFromTheDll);
}
base.WndProc(ref m);
}