J'écris une application C# qui doit intercepter les messages de fenêtre qu'une autre application envoie. La société qui a écrit l'application que je surveille m'a envoyé un exemple de code, mais c'est en C++ que je ne connais pas vraiment.C# - Capture de messages Windows à partir d'une application spécifique
Dans l'exemple de code C++ j'ai qu'ils utilisent le code suivant:
UINT uMsg = RegisterWindowMessage(SHOCK_MESSAGE_BROADCAST);
ON_REGISTERED_MESSAGE(WM_SHOCK_BROADCAST_MESSAGE, OnShockStatusMessage)
LRESULT OnShockStatusMessage(WPARAM wParam, LPARAM lParam);
Si je comprends bien ce récupère un identifiant de Windows pour le message spécifique que nous voulons écouter. Ensuite, nous demandons à C++ d'appeler OnShockStatusMessage à chaque fois qu'un message correspondant à l'ID est intercepté.
Après un peu de recherche, je l'ai mis en place les éléments suivants en 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!");
}
}
Si je comprends bien cela devrait faire la même chose de base, en ce qu'elle:
- Trouve l'application I souhaite surveiller
- Enregistre les messages de fenêtre que je souhaite intercepter
- Montres pour tous les messages de fenêtre - puis supprime ceux dont j'ai besoin
Cependant, dans mon remplacement de la WndProc() méthode ni de mes chèques intercepter l'un des messages spécifiques ou tout message de l'application que je suis suivi.
Si je Debug.WriteLine pour tous les messages qui viennent à travers, je peux voir qu'il les surveille. Cependant, il ne filtre jamais les messages que je veux. En exécutant l'application de surveillance d'exemple écrite en C++, je peux voir que les messages de fenêtre sont envoyés et ramassés - c'est juste mon implémentation C# ne fait pas la même chose.
Le code exemple que vous avez donné ici est en fait ce que je suis en utilisant au moment :) –
@Peter Ah, manqué ça. Pourquoi avez-vous fait de la liste une liste de IntPtr? Pourquoi ne pas simplement le faire Liste? –
Andy
Je pensais que c'était juste pour copier les instructions [DllImport] de différents sites Web, voir si cela faisait une différence, mais chacun avait de légères différences. –