【发布时间】:2010-12-23 07:22:07
【问题描述】:
注意:e.IsRepeat 已确认有效。存在问题是因为我使用 从 Ubuntu 到 Windows 的远程桌面。
我找到了解决此远程桌面问题的方法:
- 在 Ubuntu 中禁用键重复。
- 在主机 Windows 中:使用“打开重复键和慢速键”启用筛选键
- 使用 regedit 转到
HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response- 将
AutoRepeatDelay、AutoRepeatRate、和设置为足够小Last Valid Delay、Last Valid Repeat。 - 禁用 FilterKeys 并重新启用以刷新注册表更改。
- 将
如何检测KeyUp/KeyDown(或PreviewKeyDown/PreviewKeyUp)事件中的键重复?
我有以下测试用例:
public Window1() {
InitializeComponent();
this.KeyDown += new KeyEventHandler(Window1_KeyDown);
this.KeyUp += new KeyEventHandler(Window1_KeyUp);
}
void Window1_KeyUp(object sender, KeyEventArgs e) {
if (e.Key == Key.D) {
Console.WriteLine("DOWN: key: {0}, rep{1}, togg{2}, dow{3}, up{4}", e.Key, e.IsRepeat, e.IsToggled, e.IsDown, e.IsUp);
}
}
void Window1_KeyDown(object sender, KeyEventArgs e) {
if (e.Key == Key.D) {
Console.WriteLine("UP: key: {0}, rep{1}, togg{2}, dow{3}, up{4}", e.Key, e.IsRepeat, e.IsToggled, e.IsDown, e.IsUp);
}
}
如果我按下字母 D 并在一段时间后释放它,它会给我 输出屏幕:
// Note: Here I press D-key down.
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
// Note: Here I release D-key.
显然e.IsRepeat 总是假的,所以这是没用的。我也注意到,有时第一个事件也是toggFalse,dowTrue,所以不能用作模式。
我还注意到,使用计时的巧妙方法可用于检测重复,但必须有本地方法来执行此操作。
【问题讨论】:
-
进一步观察:我注意到我无法重复您的实验。无论是使用文本框,是否写入控制台,是否在调试或发布中,无论是在 KeyDown 还是 PreviewKeyDown 中,它总是设置
IsRepeat。您的代码是否有一部分未显示? -
Abel,不,我为此创建了一个空项目。
-
你说你在远程桌面上。你可以不试试吗?很可能,RD + Ubuntu 正在扮演你的角色。
-
您找到了很好的解决方法!干得好(有趣的是,在 Ubuntu 中禁用它使其在 RD 中可用(尽管通过不同的方式)。
标签: c# .net wpf .net-3.5 keyboard-events