Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时调用HwndSource.RemoveHook()_C#_Wpf - Fatal编程技术网

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);
}