C# - Erfassung von Windows-Nachrichten von einer bestimmten Anwendung

Ich Schreibe ein C# - Anwendung die Bedürfnisse abfangen Fenster Nachrichten, die anderen Anwendungen gesendet wird. Das Unternehmen, schrieb die Anwendung, die ich bin monitoring schickte mir einige Beispiel-code, jedoch es ist in C++, die ich nicht wirklich wissen.

In der C++ Beispiel-code habe ich Sie den folgenden code verwenden:

 UINT uMsg = RegisterWindowMessage(SHOCK_MESSAGE_BROADCAST);
 ON_REGISTERED_MESSAGE(WM_SHOCK_BROADCAST_MESSAGE, OnShockStatusMessage)
 LRESULT OnShockStatusMessage(WPARAM wParam, LPARAM lParam);

Wie ich es verstehe dies ruft eine Id, die von Windows für die spezifische Nachricht, die wir hören wollen. Dann Fragen wir C++ zu nennen OnShockStatusMessage, wenn eine Nachricht Abgleich der Id abgefangen.

Nach ein bisschen recherche habe ich zusammengestellt, der folgende in C#

[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint RegisterWindowMessage(string lpString);

private IntPtr _hWnd; //APS-50 class reference
private List<IntPtr> _windowsMessages = new List<IntPtr>(); //APS-50 messages

private const string _className = "www.AuPix.com/SHOCK/MessageWindowClass";

//Windows Messages events
private const string _messageBroadcast = "www.AuPix.com/SHOCK/BROADCAST";
private const string _messageCallEvents = "www.AuPix.com/SHOCK/CallEvents";
private const string _messageRegistrationEvents = "www.AuPix.com/SHOCK/RegistrationEvents";
private const string _messageActions = "www.AuPix.com/SHOCK/Actions";

private void DemoProblem()
{
    //Find hidden window handle
    _hWnd = FindWindow(_className, null);

    //Register for events
    _windowsMessages.Add( new IntPtr( RegisterWindowMessage( _messageActions ) ) );
    _windowsMessages.Add( new IntPtr( RegisterWindowMessage( _messageBroadcast ) ) );
    _windowsMessages.Add( new IntPtr( RegisterWindowMessage( _messageCallEvents ) ) );
    _windowsMessages.Add( new IntPtr( RegisterWindowMessage( _messageRegistrationEvents ) ) );
}

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    //Are they registered Windows Messages for the APS-50 application?
    foreach (IntPtr message in _windowsMessages)
    {
        if ((IntPtr)m.Msg == message)
        {
            Debug.WriteLine("Message from specified application found!");
        }
    }

    //Are they coming from the APS-50 application?
    if ( m.HWnd == shock.WindowsHandle)
    {
        Debug.WriteLine("Message from specified application found!");
    }

}

So wie ich das verstehe sollte dies die gleiche grundlegende Sache ist, dass es:

  1. Findet die Anwendung, die ich überwachen möchten
  2. Registriert die Fenster-Nachrichten möchte ich abfangen
  3. Uhren für alle Fenster-Nachrichten - dann-strips, die ich brauche

Aber in meinem Außerkraftsetzung der WndProc() Methode keine meiner Prüfungen abfangen spezifische Nachrichten oder alle Nachrichten von der Anwendung, die ich bin-überwachung.

Wenn Ich Debuggen.WriteLine für alle Nachrichten, die über es, ich kann sehen, dass es der überwachung. Allerdings wird es niemals filtert die Nachrichten, die ich will.

Durch ausführen des Beispiel-monitoring-Anwendung, geschrieben in C++ kann ich sehen, dass Fenster-Nachrichten werden gesendet und abgeholt - es ist nur meine C# - Implementierung nicht das gleiche tun.

InformationsquelleAutor Peter Bridger | 2010-07-20

Schreibe einen Kommentar