C # - Erfassen von Windows-Nachrichten aus einer bestimmten Anwendung

Ich schreibe eine C # -Anwendung, die abfangen mussWindow Messages dass eine andere Anwendung sendet. Die Firma, die die von mir überwachte Anwendung geschrieben hat, hat mir einen Beispielcode gesendet, der jedoch in C ++ vorliegt und den ich nicht wirklich kenne.

m C ++ - Beispielcode verwenden sie den folgenden Code:

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

Wie ich es verstanden habe, ruft dies eine ID von Windows für die spezifische Nachricht ab, die wir abhören möchten. Dann bitten wir C ++, @ aufzuruf OnShockStatusMessage immer wenn eine mit der ID übereinstimmende Nachricht abgefangen wird.

Nach ein bisschen Recherche habe ich folgendes in C # @ zusammengestel

[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!");
    }

}

Wie ich verstehe, sollte dies das gleiche Grundlegende tun, indem es:

Findet die Anwendung, die ich überwachen möchte Registriert die Fenstermeldungen, die ich abfangen möchteUhren für alle Fenstermeldungen - dann streichen Sie diejenigen aus, die ich brauche

Jedoch in meinem Override desWndProc () -Methode: Keine meiner Prüfungen fängt eine der bestimmten Nachrichten oder eine Nachricht aus der Anwendung ab, die ich überwache.

Wenn ich Debug.WriteLine für alle Nachrichten, die durch sie kommen, kann ich sehen, dass es sie überwacht. Es werden jedoch nie die gewünschten Nachrichten herausgefiltert.

Beim Ausführen der in C ++ geschriebenen Beispiel-Überwachungsanwendung kann ich feststellen, dass Fenstermeldungen gesendet und abgerufen werden - nur meine C # -Implementierung macht das nicht genauso.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage