在我的应用程序中,我有一个应该覆盖整个屏幕的加载屏幕(徽标省略了):期望的
我的视图由网格中包含的StackPanel (徽标和一些文本)组成。它使用来自Window.Show库的System.Windows ()来显示。
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:
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:
private void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.LWin && Keyboard.IsKeyDown(Key.Down))
{
e.Handled = true;
}
}c.为两个键创建单独的布尔值,如果两者都设置为true,则忽略事件。
2.将KeyBindings添加到窗口并给它一个空命令:
a.使用修饰符和键:
InputBindings = { new KeyBinding() { Modifiers = ModifierKeys.Windows, Key = Key.Down, Command = EmptyCommand } }b.只使用Down键:
InputBindings = { new KeyBinding() { Key = Key.Down, Command = EmptyCommand } }对于第1点,我注意到的是,KeyDown事件是为Windows键触发的,而不是针对Down键触发的。似乎只要我仍然持有Windows,Down密钥就永远不会被确认。对于第2点,同时拥有修饰符和键(a点)似乎根本不起作用;我在EmptyCommand中的断点从未被击中。而且,只拥有Down密钥(b点)似乎与第1点中的问题相同,即它将为只使用LWin键的KeyBinding触发,但不会被确认为Down密钥(因为我们仍然持有LWin)。
下面是我查过的一些链接:
发布于 2020-05-14 18:29:57
这可能不是一个理想的解决方案,但是如果LWin + Down (还原下降)触发了一个大小更改事件,也许您可以强制重置窗口状态?
XAML:SizeChanged="MyLoaderView_OnSizeChanged"
代码隐藏:
private void MyLoaderView_OnSizeChanged(object sender, SizeChangedEventArgs e)
{
Window window = (Window)sender;
window.WindowState = WindowState.Maximized;
}发布于 2022-01-14 06:45:11
这绝对可以用键盘妓女解决。捕获win+arraws组合键并处理它。
使用TonyValenti强大的本地钩子包,我编写了下面的代码。
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;请记住释放键盘或侦听器以避免内存泄漏。
https://stackoverflow.com/questions/61803686
复制相似问题