gpt4 book ai didi

c# - PreviewKeyDown 没有看到 Alt 修饰符

转载 作者:IT王子 更新时间:2023-10-29 04:15:07 25 4
gpt4 key购买 nike

我有一些代码(应该是)捕获击键。顶层窗口有一个

Keyboard.PreviewKeyDown="Window_PreviewKeyDown"

子句和支持 CS 文件包含:

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) {
if (e.KeyboardDevice.Modifiers == ModifierKeys.Control) {
switch (e.Key) {
case Key.L:
btnPrev_Click(sender, new RoutedEventArgs());
e.Handled = true;
break;
case Key.R:
btnNext_Click(sender, new RoutedEventArgs());
e.Handled = true;
break;
}
}
}

现在一切正常,CTRLLCTRLR 都调用了相关函数。

一旦我将修饰符检查更改为使用 ModifierKeys.Alt,它就会停止工作。换句话说,ALTLALTR 都不会调用函数。

我在这里错过了什么?

最佳答案

问题在于,当按住 Alt 键时,您的 KeyEventArgs 有:

Key = Key.System
SystemKey = the real key

因此,在检查 Alt 时,您需要使用 e.SystemKey 而不是 e.Key,如下所示:

if (e.KeyboardDevice.Modifiers == ModifierKeys.Alt) {   
switch (e.SystemKey) {
...

解释

在 Windows 下,“Alt”键被特殊处理。当按下 Alt 键本身或在按住 Alt 键的同时按下另一个键时,它被认为是“系统”按键。 “系统”按键的处理方式在很多方面都不同于常规按键。

这一切都始于 Windows 将按键传递给您的应用程序。正常的按键按下事件会生成 WM_KEYDOWN,但如果按下 Alt 键,则会生成 WM_SYSKEYDOWN。出于同样的原因,WM_KEYUP 被转换为 WM_SYSKEYUP。

在整个 Windows 中,包括在 WPF 中,Alt 键的特殊处理用于包含“访问文本”的菜单项、按钮和标签。例如,如果按钮的内容为“Say _Hi”,则按 Alt-H 将被视为单击按钮。

当按下 Alt 键时,字母会以三对事件的形式出现:KeyDown、KeyUp 和 TextInput,每个事件都有其关联的预览版本。这里的主要区别是:

  • KeyDown 和 KeyUp 事件将它们的 Key 属性设置为“Key.System”而不是实际按下的键,并且 SystemKey 设置为实际按下的键。
  • TextInput 事件正常传递,但如果未使用则作为 AccessKey 处理

关于c# - PreviewKeyDown 没有看到 Alt 修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3099472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com