【发布时间】:2025-12-21 11:35:11
【问题描述】:
我正在使用 C# 和 WPF。当使用 KeyDown 事件处理程序来监视键盘输入时,一切正常。 按住 1 个键,甚至 2 个键时,一切都很好。 当我同时按下 2 个键并按住它们时,就会出现问题。当我这样做时,两个键的 KeyDown 事件被重复触发,并且 IsRepeat 值为 false。当您同时按住 2 个键时,它会反复触发新事件。
为什么会发生这种情况,我怎样才能让它不发生?
下面是一个 .net 核心 WPF 示例,我在其中监视 KeyDown 事件并查找 A 或 S 键。我可以按住 A,我可以按住 S,我的代码只会为每个生成一次非重复事件。我什至可以连续快速按下它们。
如果我同时按下并按住它们,则会重复生成新的非重复 KeyDown 事件。这就是我试图阻止或了解它发生的原因。
MainWindow.xaml.cs:
using System.Windows;
using System.Windows.Input;
namespace TwoSimultaneousKeyDowns
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OnKeyDownHandler(object sender, KeyEventArgs e)
{
//If A or S is pressed
if (e.Key.ToString() == "A" || e.Key.ToString() == "S")
{
//Checks if it is a repeat event (repeats happen when you hold the button down)
if (!e.IsRepeat)
{
txtBox1.Text += e.Key.ToString() + " was pressed.\r\n";
}
}
}
}
}
MainWindow.xaml:
<Window x:Class="TwoSimultaneousKeyDowns.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TwoSimultaneousKeyDowns"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" KeyDown="OnKeyDownHandler">
<Grid Focusable="True">
<Grid.ColumnDefinitions>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBox x:Name="txtBox1" Grid.Column="1" HorizontalAlignment="Center" TextWrapping="Wrap" VerticalAlignment="Center" Height="400" Width="300"/>
</Grid>
【问题讨论】:
-
不要将枚举值与字符串进行比较。始终将其与另一个枚举(相同的集合)进行比较:
if (e.Key == Key.A)。不确定你观察到什么。您可能对条件检查感到困惑。您已反转 IsRepeated ,因此在重复键时不会看到 TextBox 的任何输出。 “我可以按住A,我可以按住S,我的代码只会为每个生成一个非重复事件。我什至可以连续快速按下它们。”:这是正确的根据你的实现行为。 -
如果我使用此代码同时按下 A 和 S,这是我得到的输出,直到我松开:A 被按下。 S被按下。 A被按下。 S被按下。 A被按下。 S被按下。 A被按下。 S被按下。 A 被按下。