我打电话HwndSource.AddHook()是为了让消息在我的 WPF 窗口中处理。我想知道我是否需要HwndSource.RemoveHook()在窗口被销毁时调用 - 这个窗口不是 MainWindow。如果是这样,称它为 ( Closing()) 的正确位置是什么?当窗口被销毁时,似乎 Hooks 被删除了。protected override void OnSourceInitialized(EventArgs e){ base.OnSourceInitialized(e); HwndSource source = PresentationSource.FromVisual(this) as HwndSource; source.AddHook(WndProc);}private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled){ if (NativeMethods.UWM_SHOWMYAPP == msg) { if (this.WindowState == WindowState.Minimized) this.WindowState = WindowState.Normal; this.Activate(); handled = true; } return IntPtr.Zero;}void StatusWindow_Closing(object sender, CancelEventArgs e){ HwndSource source = PresentationSource.FromVisual(this) as HwndSource; source.RemoveHook(WndProc);} 在这里删除时我又得到了HwndSource。这个可以吗?还是我应该保留该source对象Add()并将其用于Remove()?
1 回答
蓝山帝景
TA贡献1843条经验 获得超7个赞
如果是这样,调用它 (Closing()) 的正确位置是什么?
您可以覆盖该OnClosed方法。
这个可以吗?还是我应该保留用于的源对象Add()并将其用于Remove()?
它“没问题”,但没有必要PresentationSource.FromVisual多次调用和转换结果。这可能是我会怎么做:
private HwndSource _source;
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
_source = PresentationSource.FromVisual(this) as HwndSource;
_source.AddHook(WndProc);
}
protected override void OnClosed(EventArgs e)
{
_source.RemoveHook(WndProc);
base.OnClosed(e);
}
- 1 回答
- 0 关注
- 62 浏览
添加回答
举报
0/150
提交
取消