注意: e.IsRepeat
已被确认可以工作,问题的存在是因为我在 Ubuntu 到 Windows 的远程桌面模式下使用了
我找到了一个解决这个远程桌面问题的方法:
- 在 Ubuntu 中禁用键盘重复功能。
- 在主机 Windows 中:启用带有“打开重复键和慢键”的 FilterKeys。
- 使用 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
总是false,所以它是无用的。我还注意到有时第一个事件也是toggFalse、dowTrue,所以不能将其用作模式。
我还发现可以使用巧妙的时间方式来检测重复,但肯定有本机的方法来实现此功能。