为了账号安全,请及时绑定邮箱和手机立即绑定

何时调用 HwndSource.RemoveHook()

何时调用 HwndSource.RemoveHook()

C#
守着星空守着你 2022-12-31 14:04:17
我打电话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);

}


查看完整回答
反对 回复 2022-12-31
  • 1 回答
  • 0 关注
  • 62 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信