Cia*_*tic 7 .net c# wpf keyboard-events .net-3.5
注意:e.IsRepeat确认可行.存在的问题是因为我使用从Ubuntu到Windows的远程桌面.
我找到了此远程桌面问题的解决方法:
HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response
AutoRepeatDelay,AutoRepeatRate,和 Last Valid Delay,Last Valid Repeat足够小.如何检测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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我按下字母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.
Run Code Online (Sandbox Code Playgroud)
显然,这e.IsRepeat总是错误的,所以没用.我还注意到有时第一个事件也是toggFalse,dowTrue,因此不能用作模式.
我还注意到,使用计时的聪明方法可用于检测重复,但必须有一种本机方式来执行此操作.
为什么不使用原生的可能性?我在窗口和两个文本框上添加了一个PreviewKeyDown事件.在第二个文本框中按下并按住键,这是输出:
Repeat: False, key: D
Repeat: True, key: D
Repeat: True, key: D
Repeat: True, key: D
Repeat: True, key: D
Repeat: True, key: D
Repeat: True, key: D
Repeat: True, key: D
Run Code Online (Sandbox Code Playgroud)
这是我使用的代码:
private void Grid_PreviewKeyDown(object sender, KeyEventArgs e)
{
textBox1.Text += String.Format(
"Repeat: {0}, key: {1}\n",
e.IsRepeat,
e.Key);
}
Run Code Online (Sandbox Code Playgroud)
更新:删除了我的所有代码(其他测试中有一些垃圾)并按原样粘贴在您的代码中.它在控制台中给了我以下输出,所以我想我们应该看看其他原因......
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
UP: key: D, repTrue, toggTrue, dowTrue, upFalse
UP: key: D, repTrue, toggTrue, dowTrue, upFalse
UP: key: D, repTrue, toggTrue, dowTrue, upFalse
UP: key: D, repTrue, toggTrue, dowTrue, upFalse
UP: key: D, repTrue, toggTrue, dowTrue, upFalse
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5418 次 |
| 最近记录: |