postmessage()收到c#时的事件

时间:2015-06-04 06:31:40

标签: c# delphi

我有一个带有delphi的非托管DLL,并且集成了一些在运行时某些点触发的事件。 在其手册中,它表示它调用了Win32 api PostMessage()

当事件被触发时,会发送一条短信,wParam和IParam会有其他信息。

当发布来自dll的消息并且获取信息时,如何从我的c#应用程序中触发事件?

更新:

试图描述手册的内容: 所以我有一个名为init()的函数,它接受我传递的handle参数,如下所示:

wr.Init((IntPtr)this.Handle);

从c#Winform应用程序到非托管dll,如果没问题则返回true,这就是我所看到的。

现在手册说:

  

当事件(来自dll)被触发时,它会向随Init函数提供的窗口句柄发送一条Windows消息,实际上调用了PostMessage()Win32 API。

我有PostMessage()上发送的消息列表,例如:

TextMessage: WM_TECH_BROKENLINE
wParam: Point (which is a number displaying for example where is broken)
IParam: 0

现在正如我解释的那样,我希望当从dll发布上面的消息时,我会从c#和oncourse发出一个事件来获取短信和Params

2 个答案:

答案 0 :(得分:1)

必要的步骤如下:

  1. 在C#程序中获取窗口的窗口句柄。
  2. 将该窗口句柄传递给非托管DLL,以便它知道将消息发送到何处。
  3. 在您的C#代码中,添加代码以接收和响应到达的消息。
  4. 作为上述替代方案,您可能更喜欢将程序的GUI窗口与此消息传递机制分开。在这种情况下,请执行以下操作:

    1. 创建NativeWindow的子类来处理传入的消息。
    2. 创建类的实例,并将其窗口句柄传递给非托管DLL。
    3. 覆盖窗口类中的WndProc,然后在那里处理消息。此时,您可以将其表现为事件。
    4. 后一种方法可以更好地将您的互操作代码与您的GUI分离,并且可以让您的封装更少与GUI混淆。

      为了更详细地描述这些内容,需要了解程序的详细信息。例如,它是WinForms还是WPF?您的程序是否有一个窗口可以接收消息?字符串是如何编码的?它在哪个消息arg到达?如果消息是异步传递的,那么字符串的内存是如何解除分配的?

      我怀疑你会回答其中一些问题,但也许不是全部。您现在知道自己需要做什么,但现在需要了解自己程序的更多细节。

答案 1 :(得分:0)

尝试覆盖处理您传递给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);
    }