如何在WPF中禁用LWin和Arrow快捷方式?

问题描述 投票:1回答:1

在我的应用程序中,我有一个加载屏幕,该屏幕应该覆盖整个屏幕(省略徽标):Expected

我的视图由网格中包含的StackPanel(用于徽标和一些文本)组成。使用System.Windows库中的Window.Show()显示它。

var popup = new Window()
        {
            WindowState = WindowState.Maximized,
            WindowStyle = WindowStyle.None,
            AllowsTransparency = true,
            Visibility = Visibility.Visible,
            HorizontalAlignment = HorizontalAlignment.Center,
            VerticalAlignment = VerticalAlignment.Center,
            Content = loaderMvvmSet.View, 
            IsHitTestVisible = true,
            Background = new SolidColorBrush(Colors.White) { Opacity = 0.1 },
            Topmost = true,
            ShowInTaskbar = false
        };

[测试时,我们注意到用户可以使用Window + Arrow组合键绕过加载屏幕。要禁用此大小调整,我设置为ResizeMode = ResizeMode.NoResize。这似乎对单击Windows + Up / Right / Left有用。但是,当我单击Windows + Down时,我得到的是:Actual

我检查了其他帖子,但无法找到解决我问题的方法。这是我尝试过的:

1。将事件处理程序附加到KeyDown事件:

a。将每个键的Handled属性分别设置为true:

    private void OnKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.LWin)
        {
            e.Handled = true;
        }

        if (e.Key == Key.Down)
        {
            e.Handled = true;
        }
    }

b。检查是否同时按下了两个键并将Handled属性设置为true:

    private void OnKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.LWin && Keyboard.IsKeyDown(Key.Down))
        {
            e.Handled = true;
        }
    }

c。为两个键创建单独的布尔值,然后如果两个都设置为true,则将忽略该事件。

2。向窗口添加了键绑定,并给它一个空命令:

a。使用修饰符和键:

InputBindings = { new KeyBinding() { Modifiers = ModifierKeys.Windows, Key = Key.Down, Command = EmptyCommand } }

b。仅使用Down键:

InputBindings = { new KeyBinding() { Key = Key.Down, Command = EmptyCommand } }

我注意到的第一点是KeyDown事件是为Windows键触发的,而不是Down键触发的。好像只要我仍然按住Windows键,Down键就不会被确认。对于点2,同时拥有修饰符和键(点a)似乎根本不起作用;我在EmptyCommand中的断点从未被击中。并且,仅具有Down键(点b)似乎与第1点中的问题相同,它将仅使用LWin键来触发KeyBinding,但不会被Down键确认(因为我们仍然持有LWin)。

这里是我检查过的一些链接:

How to detect multiple keys down onkeydown event in wpf?

Understanding multiple keys with WPF KeyDown event

c# wpf keyboard-events
1个回答
0
投票

这可能不是理想的解决方案,但是如果LWin + Down(恢复还原)触发了大小更改事件,也许您可​​以强制重置窗口状态?

根据https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.resize?redirectedfrom=MSDN&view=netcore-3.1

XAML:SizeChanged="MyLoaderView_OnSizeChanged"

隐藏代码:

private void MyLoaderView_OnSizeChanged(object sender, SizeChangedEventArgs e)
{
    Window window = (Window)sender;
    window.WindowState = WindowState.Maximized;
}
© www.soinside.com 2019 - 2024. All rights reserved.