Когда вызывать HwndSource.RemoveHook () - PullRequest
0 голосов
/ 26 апреля 2019

Я звоню HwndSource.AddHook(), чтобы получить сообщения для обработки в моем окне WPF. Интересно, нужно ли мне вызывать HwndSource.RemoveHook(), когда окно уничтожено - это окно не MainWindow. Если так, то каково правильное место для его вызова (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. Это нормально? или я должен оставить объект source, используемый для Add(), и использовать его для Remove()?

1 Ответ

1 голос
/ 26 апреля 2019

Если это так, каково правильное место для его вызова (Закрытие ())?

Вы можете переопределить метод 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...