首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在WPF中禁用LWin和Arrow快捷方式?

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

Stack Overflow用户
提问于 2020-05-14 17:30:51
回答 2查看 372关注 0票数 1

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

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

代码语言:javascript
运行
复制
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时,会得到以下内容:实际

我查看了其他帖子,但一直未能找到解决问题的办法。以下是我尝试过的:

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

a.为每个键分别将已处理的属性设置为true:

代码语言:javascript
运行
复制
    private void OnKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.LWin)
        {
            e.Handled = true;
        }

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

b.检查按下两个键并将已处理的属性设置为true:

代码语言:javascript
运行
复制
    private void OnKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.LWin && Keyboard.IsKeyDown(Key.Down))
        {
            e.Handled = true;
        }
    }

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

2.将KeyBindings添加到窗口并给它一个空命令:

a.使用修饰符和键:

代码语言:javascript
运行
复制
InputBindings = { new KeyBinding() { Modifiers = ModifierKeys.Windows, Key = Key.Down, Command = EmptyCommand } }

b.只使用Down键:

代码语言:javascript
运行
复制
InputBindings = { new KeyBinding() { Key = Key.Down, Command = EmptyCommand } }

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

下面是我查过的一些链接:

如何在wpf中检测按下事件的多个键?

使用WPF KeyDown事件理解多个键

EN

回答 2

Stack Overflow用户

发布于 2020-05-14 18:29:57

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

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

XAML:SizeChanged="MyLoaderView_OnSizeChanged"

代码隐藏:

代码语言:javascript
运行
复制
private void MyLoaderView_OnSizeChanged(object sender, SizeChangedEventArgs e)
{
    Window window = (Window)sender;
    window.WindowState = WindowState.Maximized;
}
票数 0
EN

Stack Overflow用户

发布于 2022-01-14 06:45:11

这绝对可以用键盘妓女解决。捕获win+arraws组合键并处理它。

使用TonyValenti强大的本地钩子包,我编写了下面的代码。

代码语言:javascript
运行
复制
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;

请记住释放键盘或侦听器以避免内存泄漏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61803686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档