2015-06-04 26 views
-2

我有一个非托管的DLL与delphi和集成有一些事件在运行时的某些点触发。 在它的手册上它说它调用Win32 api PostMessage()事件postmessage()收到C#

当事件被触发时,将发送文本消息,并且wParam和IParam还有一些其他信息。

如何从c#应用程序中发出事件并发送来自dll的消息并且当然可以获取信息?

UPDATE:

试图描述什么手册说: 所以我有一个函数调用的init(),它接受它我传递的句柄参数如下:

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

从c#Winform应用程序到非托管dll,如果它很好,那么返回true,这就是我所看到的。

现在手册说:

当事件(从DLL)被触发它发送窗口消息到与初始化函数提供的窗口句柄,事实上PostMessage的()的Win32 API被调用。

,我已经被例如在PostMessage的()发送的消息的列表:

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

现在,作为我解释我想的是,当像之一的消息的上方从贴DLL我从C#触发一个事件,并ofcourse收到短信和PARAMS

回答

1

的必要步骤如下:

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

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

  1. 创建NativeWindow的子类来处理传入消息。
  2. 创建类的实例并将其窗口句柄传递给非托管DLL。
  3. 在您的窗口类中重写WndProc,然后在那里处理消息。在这一点上,您可以将其表现为事件。

这后一种方法可以更好地将您的interop代码从GUI中分离出来,并且可以使您的包装与GUI更少地缠结。

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

我怀疑你会对这些问题的答案,但也许不是全部。你现在知道你需要做什么,但是现在需要为你自己的程序找出更多的细节。

+0

所以给了一些信息,抱歉。这是一个WinForms应用程序在C#中,我已经获得一个窗口句柄,并将其发送到非托管的DLL,但现在我不知道如何抓住事件 – Combinu

+0

我回答了你问与一个匹配的数量的细节的问题。问题和答案保持良好匹配。也许你的下一个任务是投入足够的时间来详细解释你所期望的答案。 –

+0

更新了问题也许可以帮助更多,但这是我不幸的所有信息:/ – Combinu

0

尝试覆盖WndProc处理传递给dll的表单的方法。一个例子可以在这里找到: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); 
    } 
+0

从dll函数需要作为一个参数,我通过句柄,这是不是一个问题......我需要的是,当我有一个事件发布在Win32上,所以我可以触发一个事件在c#并且当然可以获取DLL发布的信息 – Combinu