2009-06-04 29 views
0

クライアントアプリケーションに通知する必要があるC++ DLLを作成しています。 C++(MFC)では、DLL内にクライアントウィンドウハンドルを登録し、クライアントに何かについて通知する必要があるときにPostMessageを呼び出すことができます。クライアントがC#アプリケーションの場合は何ができますか?C++ DLLから.NETアプリケーションへの通知の送信

答えて

1

あなたは、この特定のメッセージ

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg = YOUR_MESSAGE) 
    { 
     // handle the notification 
    } 
    else 
    { 
     base.WndProc(ref m); 
    } 
} 
1

PostMessageは、別のアプリケーションのメインアプリケーションループにメッセージを発行するようにWindowsに指示するだけです。クライアントがC#アプリケーションであれば、ほぼ確実に同じことをするでしょう。つまり、C#のメインアプリケーションループに送信されたメッセージをどのように読むのですか?

+0

右。答えは...? – Curtis

+0

PostMessageを使用するよりも良い方法はありますか? – Curtis

+0

コールバックが使えますか? – cdonner

0

を処理するためのC#ウィンドウにWndProcメソッドをオーバーライドすることができますが、貧乏人のパブリッシュ・サブスクライブ・パターンを実装したい場合は、コールバックが移動するための方法です。 this threadには良い情報があります。

1

Windowsハンドルにメッセージを投稿することで可能です。あなたのドットネットクラスでは、メッセージを傍受してからメッセージを発信できるダミーのウィンドウを作成します。

ここにいくつかのコードがありますが、WM_MYMESSAGEを使用した場所を記入して、適切なウィンドウメッセージを参照してください.C++ dllでメッセージを投稿することができます。注意してください、私はあなたが望むことを行うためのより良い/他の方法があると確信していますが、これはおそらくはうまくいくでしょう。メッセージを傍受する

//Dummy window classes. Because we don't have access to the wndproc method of a form, we create 
//dummy forms and expose the method to the SystemHotKeyHook class as an event. 

/// <summary> 
/// Inherits from System.Windows.Form.NativeWindow. Provides an Event for Message handling 
/// </summary> 
private class NativeWindowWithEvent : System.Windows.Forms.NativeWindow 
{ 
    public event MessageEventHandler ProcessMessage; 
    protected override void WndProc(ref Message m) 
    { 
     //Intercept the message you are looking for... 
     if (m.Msg == (int)WM_MYMESSAGE) 
     { 
      //Fire event which is consumed by your class 
      if (ProcessMessage != null) 
      { 
       bool Handled = false; 
       ProcessMessage(this, ref m, ref Handled); 
       if (!Handled) 
       { 
        base.WndProc(ref m); 
       } 
      } 
      else 
      { 
       base.WndProc(ref m); 
      } 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 
} 
/// <summary> 
/// Inherits from NativeWindowWithEvent and automatic creates/destroys of a dummy window 
/// </summary> 
private class DummyWindowWithEvent : NativeWindowWithEvent, IDisposable 
{ 
    public DummyWindowWithEvent() 
    { 
     CreateParams parms = new CreateParams(); 
     this.CreateHandle(parms); 
    } 
    public void Dispose() 
    { 
     if (this.Handle != (IntPtr)0) 
     { 
      this.DestroyHandle(); 
     } 
    } 
} 

クラス:

// <summary> 
/// System hotkey interceptor 
/// </summary> 
public class MessageIntercept: IDisposable 
{ 
    private delegate void MessageEventHandler(object Sender, ref System.Windows.Forms.Message msg, ref bool Handled); 

    //Window for WM_MYMESSAGE Interceptor 
    private DummyWindowWithEvent frmDummyReceiver_m; 

    /// <summary> 
    /// Default constructor 
    /// </summary> 
    public MessageIntercept() 
    { 
     this.frmDummyReceiver_m = new DummyWindowWithEvent(); 
     this.frmDummyReceiver_m.ProcessMessage += new MessageEventHandler(this.InterceptMessage); 
    } 

    private void InterceptMessage(object Sender, ref System.Windows.Forms.Message msg, ref bool Handled) 
    { 
     //Do something based on criteria of the message 
     if ((msg.Msg == (int)WM_MYMESSAGE) && 
      (msg.WParam == (IntPtr)xyz)) 
     { 
      Handled = true; 
      System.Diagnostics.Debug.WriteLine("Message intercepted."); 
     } 
    } 
} 
1

が一緒にどのように密接に2つのワークに応じて、私はおそらく、コールバック/イベント・アプローチを使用すると思います。あなたが作ることができる私に

全体「のPostMessage」アプローチ、ハックのビットのように思えるが(それはあなたが投稿している標準メッセージだならば、それは明らかにいいのよ、あなたは何をしたいかによって異なります)

ネイティブクラス用のマネージC++ラッパーを使用すると、マネージラッパーはコールバックを処理し、C#クラスがリッスンできるマネージ(C#互換)イベントを発行できます。

一般的に私はネイティブC++をC#とC#層で結びつけることを熱心にしています。つまり、C#アプリケーションはネイティブC++コードのすべての「醜い」低レベルの詳細を知る必要はありません。

関連する問題