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消息
怎么了?我怎样才能捕捉到这条消息/事件?
当您
按 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;
});
}