wpf 状态更改事件未触发

本文关键字:事件 状态 wpf | 更新日期: 2023-09-27 18:35:09

如果我按 Win + D,则 StateChanged 事件不会触发,

但如果 ResizeMode 是 CanResize,则 StateChanged 事件正在触发。

<Window x:Class="WpfApplication3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" WindowStyle="None" ResizeMode="NoResize" WindowState="Maximized">
<Grid>
</Grid>

如果我挂接一个消息循环并调试它,我永远不会使用 "NoResize" 进入 Win + D

IntPtr mainWindowPtr = new WindowInteropHelper(sender as Window).Handle;
HwndSource mainWindowSrc = HwndSource.FromHwnd(mainWindowPtr);
mainWindowSrc.AddHook(Hook);

但是如果我用Microsoft Spy++进行间谍监视,则在Win + D上会显示一条WM_WINDOWPOSCHANGED消息

怎么了?我怎样才能捕捉到这条消息/事件?

wpf 状态更改事件未触发

当您

Windows + D 时,您的应用程序Window不会调整大小,因此没有理由触发 StateChanged 事件。可以通过运行应用程序并按 Alt + 空格键查看Window状态选项来验证这一点。您会注意到"最大化"、"最小化"和"还原"选项灰显,这意味着无法选择它们。

这是因为您已将 ResizeMode 属性设置为 NoResize,并解释了为什么当它设置为 CanResize 时会得到不同的结果。因此,无论操作系统在按下Windows + D时隐藏Window做什么都不涉及调整它们的大小。

得到同样的情况。

Window.ResizeMode NoResize,我正在尝试Show()然后以编程方式Hide() Minimized窗口。

即使我在代码中更改了 WindowState 属性,事件也没有在Hide()上触发(但已经在Show() btw 上触发)。

就我而言,我

自己发射了它,它对我有用。

public new void Hide()
    {
        Dispatcher.Invoke(() =>
        {
            base.Hide();
            WindowState = WindowState.Minimized;
            base.OnStateChanged(new EventArgs());
        });
    }
    public new void Show()
    {
        Dispatcher.Invoke(() =>
        {
            base.Show();
            base.Topmost = true;
            WindowState = WindowState.Normal;
        });
    }