【发布时间】:2016-08-20 19:38:45
【问题描述】:
我在不是主窗口的 WPF 窗口中使用HwndSource,以便挂钩窗口过程 (WndProc) 以接收一些消息:
WinSource = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
WinSource.AddHook(new HwndSourceHook(WndProc));
HwndSource 实现IDisposable。 MSDN 不清楚我何时/应该处置它。 HwndSource.FromHwnd 的文档解释了上述技术:
您可以使用此方法为不是显式互操作窗口的窗口返回 HwndSource。这个过程是:
- 创建一个 WindowInteropHelper 实例(提供主窗口作为构造函数参数)。
- 从 WindowInteropHelper 实例中获取 Handle 属性的值。
- 将该 HWND 值作为参数传递给 FromHwnd。
然后:
如果您想将一般的 AddHook 消息处理添加到窗口,此技术可能很有用。但是,无论何时创建 HwndSource,您也有责任销毁它。即使应用程序 HwndSource 的 Application 对象被释放也是如此。
(重点是我的)
但是,在HwndSource 类文档中,我们看到:
对象生命周期
HwndSource 是常规公共语言运行时 (CLR) 对象,其生命周期由垃圾收集器管理。因为 HwndSource 表示非托管资源,所以 HwndSource 实现 IDisposable。 [...] 对于某些互操作场景,可能需要从互操作代码中显式调用 Dispose。
关于钩子:
实际的钩子由弱引用持有。因此,请确保您管理钩子委托的生命周期。
【问题讨论】:
标签: wpf interop idisposable