c# - c#中的按键检测和发送
问题描述
所以我想做的是找到我是否完全按下了空格键,而我希望释放空格键,然后在大约 10 毫秒的延迟内再次按下多次。我试图阅读和理解这个链接(https://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx)但它仍然混淆任何帮助?我是 c# 的新手,但我对 pascal 有一些经验,我发现其中非常相似(使用 Visual Studio 2015,因为我的电脑不允许我更新到 Windows 8.1)
解决方案
10ms delay
意味着每秒100次,没有人能做到。
关键事件按以下顺序发生:
- 按键
- 按键
- 键升
事件KeyDown
和KeyUp
使用KeyEventArgs
, while KeyPress
is KeyPressEventArgs
,
KeyEventArgs
可以详细说明同时按下了多少个键。KeyEventArgs.KeyCode
是Keys
一个[Flags]
枚举,它可以包含多个键,如 CTRL+SHIft+F+G
如果您的热键是 Ctrl+Shift+Space,您可以检查:
var hotkeyPressed = e.Control && e.Shift && e.KeyCode == Keys.Space;
如果您的热键是 Ctrl+F10+Space,您可以检查:
var hotkeyPressed = e.Control && e.KeyCode == (Keys.Space | Keys.F10);
但不要使用:
var hotkeyPressed = e.Control && e.KeyCode.HasFlag(Keys.F10) && e.KeyCode.HasFlag(Keys.Space); // e.KeyCode probably contains other flags
KeyPressEventArgs.KeyChar
是一个字符串,看看源码,关注它的注释
[ComVisible(true)]
public class KeyPressEventArgs : EventArgs
{
...
/// <summary>Gets or sets the character corresponding to the key pressed.</summary>
/// <returns>The ASCII character that is composed. For example, if the user presses SHIFT + K, this property returns an uppercase K.</returns>
public char KeyChar { get; set; }
...
}
使用哪个事件,这取决于您的要求。这是 KeyDown 中的示例代码:
private int counting = 0, limit = 10;
private void txt_KeyDown(object sender, KeyEventArgs e)
{
if (!e.KeyCode.HasFlag(Keys.Space)) //check if your expected key is pressed
{
counting = 0;
return;
}
//start counting
counting++;
if (counting > limit)
{
e.Handled = true;
//do you business work, like: Send something somewhere
}
else
{
//do something else, like: show the number 'counting' in GUI
}
}
如果您想限制下一个空间的时间跨度,请使用计时器
private void txt_KeyDown(object sender, KeyEventArgs e)
{
timer1.Stop();
if (!e.KeyCode.HasFlag(Keys.Space))
{
counting = 0;
return;
}
//start counting
timer1.Start();
counting++;
if (counting > limit)
{
e.Handled = true;
//do you business work, like: Send something somewhere
}
else
{
//do something else, like: show the number 'counting' in GUI
}
}
//timer1.Interval = 100; //100ms timeout. user has to press space again within 100ms
private void timer1_Tick(object sender, EventArgs e)
{
counting = 0;
}
推荐阅读
- ruby - 提示用户正确输入
- javascript - 使用 JavaScript 进行 Telnet 连接
- typescript - Typescript 访问对象属性类型而不触发循环引用
- prometheus - 带有 Prometheus 查询的 Grafana Ad-hoc 过滤器
- php - 使用 Scandir 间歇性刷新文件链接问题
- sql - 一种在两个不同表中将 SQL 位与 char 进行比较的方法
- python - 当索引同时是时间戳和日期时间时,将所有索引值转换为日期时间
- java - 为什么在 JSON 有效负载请求正文中发送 http 请求元数据被认为是不好的做法,而最好使用请求标头?
- python - 如何在 Azure 机器学习 Juypyter Notebooks 中安装 python ta-lib 库
- python - 如何更改我的代码以从此列表中绘制表格?