【问题标题】:How to Disable LWin and Arrow shortcut in WPF?如何在 WPF 中禁用 LWin 和箭头快捷方式?
【发布时间】:2020-05-14 17:30:51
【问题描述】:

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

我的视图由 Grid 中的 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 事件:

一个。将每个键的 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。将 KeyBindings 添加到 Window 并给它一个空命令:

一个。使用修饰符和键:

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

b.仅使用 Down 密钥:

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

我注意到第 1 点是针对 Windows 键而不是 Down 键触发 KeyDown 事件。似乎只要我仍然持有 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】:

这可能不是一个理想的解决方案,但是如果LWin + Down (Restore 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;
}

【讨论】:

  • 这个解决方案似乎大部分都有效。然而,当点击Windows + Down 时,窗口会在小版本和最大化之间闪烁,而Windows + Up \ Right \ Left 根本没有注册到ResizeMode = ResizeMode.NoResize
【解决方案2】:

这绝对可以用键盘钩子解决。捕获 win+arraws 组合键并进行处理。

使用TonyValenti's powerful native hook package,我在下面写了代码。

var KeyboardDisposable = WindowsInput.Capture.Global.KeyboardAsync();
var Listener = new KeyChordEventSource(Keyboard, new ChordClick(KeyCode.LWin, KeyCode.Left));
Listener.Triggered += (s, e) =>
{
    if (User32.GetForegroundWindow() == WpfWindowHandle)
    {
        e.Input.Next_Hook_Enabled = false;
    }
};
Listener.Enabled = true;

记得配置键盘或监听器以避免内存泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2017-04-24
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多