何时调用 HwndSource.RemoveHook()

我打电话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()?


守着星空守着你
浏览 63回答 1
1回答

蓝山帝景

如果是这样,调用它 (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);}
打开App,查看更多内容
随时随地看视频慕课网APP