C # - захват сообщений Windows из определенного приложения
Я пишу приложение на C #, которое нужно перехватитьОконные сообщения что другие приложения отправляет. Компания, написавшая приложение, которое я отслеживала, прислала мне пример кода, однако он написан на C ++, чего я на самом деле не знаю.
В коде примера C ++, который я получил, они используют следующий код:
UINT uMsg = RegisterWindowMessage(SHOCK_MESSAGE_BROADCAST);
ON_REGISTERED_MESSAGE(WM_SHOCK_BROADCAST_MESSAGE, OnShockStatusMessage)
LRESULT OnShockStatusMessage(WPARAM wParam, LPARAM lParam);
Насколько я понимаю, это извлекает идентификатор из Windows для конкретного сообщения, которое мы хотим прослушать. Затем мы просим C ++ позвонитьOnShockStatusMessage всякий раз, когда сообщение, соответствующее Id, перехватывается.
После небольшого исследования я собрал следующее в 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!");
}
}
Как я понимаю, это должно делать то же самое, что и это:
Находит приложение, которое я хочу отслеживатьРегистрирует сообщения окна, которые я хочу перехватитьСледит за всеми оконными сообщениями - затем отбирает те, которые мне нужныОднако в моем переопределенииWndProc () метод ни одна из моих проверок не перехватывает ни одно из определенных сообщений или любое сообщение от приложения, которое я наблюдаю.
Если яDebug.WriteLine для всех сообщений, которые проходят через него, я вижу, что он отслеживает их. Однако это никогда не отфильтровывает сообщения, которые я хочу.
Запустив пример приложения для мониторинга, написанного на C ++, я могу видеть, что Window Window отправляются и принимаются - просто моя реализация C # не делает то же самое.