我有一个使用WindowInteropHelper和HwndSource处理Windows消息的WPF窗口(“A”):
WindowInteropHelper helper = new WindowInteropHelper(this);
IntPtr windowHandle = helper.Handle;
source = HwndSource.FromHwnd(windowHandle);
source.AddHook(new HwndSourceHook(WndProc));
和WndProc看起来像这样:
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
...
else if (msg == WM_CLOSE)
{
StringBuilder strbTitle = new StringBuilder(255);
int nLength = User32.GetWindowText(hwnd, strbTitle, strbTitle.Capacity + 1); // my own method
string strTitle = strbTitle.ToString();
// log that I'm being shut down.
}
}
}
唯一的问题是“hwnd”总是返回我自己的窗口(“A”),而不是发送消息的窗口(“B”)。我如何找出发送消息的窗口?
注意:我已尝试从其他应用程序发送其他Windows消息(如移动/隐藏/显示/退出),并且我总是在“strbTitle”中获得相同的窗口名称。我已经尝试重新启动“B”并重新发送消息并且hwnd没有改变,但是如果我重新启动“A”而不是“B”那么它确实会改变(所以我很肯定hwnd是由于某种原因消息的窗口)。如果重要的话,我正在为.NET 4.0编译。
我已经做了一些搜索,但找不到任何提出这个问题的人...感谢您抽出宝贵时间来查看并帮助我!