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:
- Findet die Anwendung, die ich überwachen möchten
- Registriert die Fenster-Nachrichten möchte ich abfangen
- 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellt sich heraus, ich musste auch zum senden die andere Anwendung eine PostMessage bitten, Sie zu senden, um meine Anwendung die Fenster Nachrichten.
Nicht schön-code, aber gut genug, um zu beweisen, dass es funktioniert, das ist alles was ich brauche für jetzt 🙂
InformationsquelleAutor Peter Bridger
Ich denke, das problem ist mit dem P/Invoke-definition für
RegisterWindowMessage()
. pinvoke.net schlägt mit den folgenden:Mit
uint
als Rückgabewert stattIntPtr
sollte den Unterschied machen. In der Regel, die Sie verwenden möchtenIntPtr
wenn der Rückgabewert ist ein handle (wie einHWND
oderHANDLE
), aber wenn der return-Wert kann direkt konvertiert zu einer C# - Typ ist es besser, der Typ.Ah, übersehen, dass. Warum hast du die Liste eine Liste von IntPtr? Warum nicht einfach machen es die Liste<uint>?
Ich erwarte, dass es war nur, Sie zu kopieren [DllImport] Aussagen von anderen website, zu sehen, ob es irgendeinen Unterschied gemacht, sondern jeder hatte leichte Unterschiede.
InformationsquelleAutor Andy