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#中触发一个事件,当然得到文本消息和参数

postmessage()接收c#时的事件

必要的步骤如下:

    在你的c#程序中获取一个窗口句柄。
  1. 将该窗口句柄传递给非托管DLL,以便它知道将消息发送到哪里。
  2. 在你的c#代码中,添加代码来接收和响应到达的消息。

作为上述方法的替代方法,您可能更喜欢将程序的GUI窗口与此消息传递机制分开。在这种情况下,执行以下操作:

  1. 创建NativeWindow的子类来处理传入消息。
  2. 创建类的实例,并将其窗口句柄传递给非托管DLL。
  3. 覆盖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);
    }