gpt4 book ai didi

C# - 从特定应用程序捕获 Windows 消息

转载 作者:可可西里 更新时间:2023-11-01 18:39:48 25 4
gpt4 key购买 nike

我正在编写一个 C# 应用程序,它需要拦截另一个应用程序发送的窗口消息。编写我正在监视的应用程序的公司向我发送了一些示例代码,但它是用我不太了解的 C++ 编写的。

在我得到的 C++ 示例代码中,他们使用了以下代码:

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

据我了解,这会从 Windows 中检索一个 Id,用于我们要监听的特定消息。然后我们要求 C++ 在截获与 Id 匹配的消息时调用 OnShockStatusMessage

经过一些研究,我用 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!");
}

}

据我所知,这应该做同样的基本事情,因为它:

  1. 找到我想监控的应用
  2. 注册我希望拦截的窗口消息
  3. 监视所有窗口消息 - 然后删除我需要的消息

但是,在我重写 WndProc() 方法时,我的检查都没有拦截任何特定消息或来 self 正在监视的应用程序的任何消息。

如果我对通过它的所有消息Debug.WriteLine,我可以看到它正在监视它们。但是它永远不会过滤掉我想要的消息。

通过运行用 C++ 编写的示例监控应用程序,我可以看到正在发送和接收窗口消息 - 只是我的 C# 实现没有这样做。

最佳答案

原来我还需要向其他应用程序发送一个PostMessage,要求它向我的应用程序发送窗口消息。

PostMessage((int)_hWnd, _windowsMessages[0], SHOCK_REQUEST_ACTIVE_CALLINFO, (int)_thisHandle);
PostMessage((int)_hWnd, _windowsMessages[0], SHOCK_REQUEST_ALL_REGISTRATIONINFO, (int)_thisHandle);
PostMessage((int)_hWnd, _windowsMessages[0], SHOCK_REQUEST_CALL_EVENTS, (int)_thisHandle);
PostMessage((int)_hWnd, _windowsMessages[0], SHOCK_REQUEST_REGISTRATION_EVENTS, (int)_thisHandle);

不是很漂亮的代码,但足以证明它是有效的,这就是我现在所需要的:)

关于C# - 从特定应用程序捕获 Windows 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3289321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com