C# 何时调用HwndSource.RemoveHook()
我正在调用C# 何时调用HwndSource.RemoveHook(),c#,wpf,C#,Wpf,我正在调用HwndSource.AddHook(),以获取要在我的WPF窗口中处理的消息。我想知道当窗口被破坏时是否需要调用HwndSource.RemoveHook()——此窗口不是主窗口。如果是这样,那么调用它的正确位置是什么(Closing())?。窗户被毁时,钩子似乎被取下了 protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); HwndSource
HwndSource.AddHook()
,以获取要在我的WPF窗口中处理的消息。我想知道当窗口被破坏时是否需要调用HwndSource.RemoveHook()
——此窗口不是主窗口。如果是这样,那么调用它的正确位置是什么(Closing()
)?。窗户被毁时,钩子似乎被取下了
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
。这样行吗?或者我应该保留用于Add()
的source
对象,并将其用于Remove()
如果是这样的话,那么调用它(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);
}