【问题标题】:C# Keydown/Keyevents if no key is pressedC# Keydown/Keyevents 如果没有按键被按下
【发布时间】:2012-04-18 21:34:45
【问题描述】:

我现在正在用 c# 编写一些东西,试图将控制台应用程序“转换”为 Windows 窗体应用程序,我想做如下的事情:

if("keypress == nokey") 
{
    system.threading.thread.sleep ***
}
while(nokeyispressed) 
{
    system.threading...
}

基本问有没有按键sleep一段时间和this.close();

所以如果没有按键被按下,做一些事情...... 我只是无法让它工作。 我会非常感激一些帮助..:D

【问题讨论】:

  • 你到底是什么意思?如果在一定时间内没有发生 keydown 事件,该怎么办?
  • 一个 if 循环?你能试着更详细地解释你的问题吗?
  • keydownevent = 按键被按下
  • 如果您在没有按下任何键的情况下睡觉,您也可以这样做:while(true) { /* something to keep the CPU warm */ } ...您的程序将从此时挂起...
  • 您只是在等待程序中的关键事件发生吗?

标签: c# keypress keydown keyevent keyeventargs


【解决方案1】:

如果没有按下任何键,则不会引发 KeyDown 事件。因此,您的处理程序将不会被调用。

更新(删除循环的选项,因为计时器会为您在不同线程上的循环与睡眠超时相同):

这是带有计时器的示例:

private bool _keyPressed;

private void TimerElapsed(object sender, EventArgs e)
{
    if (!_keyPressed)
    {
        // do what you need
    }
}

private void KeyDownHandler(object sender, KeyEventArgs e)
{
    _keyPressed = true;

    switch (e.KeyCode)
    {
        // process pressed key
    }

    _keyPressed = false;
} 

更新:我认为在确定是否没有按下任何键之前验证自上次按下键后经过了多少时间

private DateTime _lastKeyDownTime;
private const int interval = 100;

private void LoadHandler(object sender, EventArgs e)
{
 // start Threading.Timer or some other timer
 System.Threading.Timer timer = new System.Threading.Timer(DoSomethingDefault, null, 0, interval);
}   

private void DoSomethingDefault(object state)
{
    if ((DateTime.Now - _lastKeyDownTime).TotalMilliseconds < interval)                            
        return;            

    // modify UI via Invoke
}

private void KeyDown(object sender, KeyEventArgs e)
{
    _lastKeyDownTime = DateTime.Now;

    switch (e.KeyCode)
    {
        // directly modify UI
    }  
}

【讨论】:

  • 对不起,但取决于循环是否在同一个线程(可能是 UI 线程)中运行,这将挂起程序并且永远不会调用处理程序 - 即使这会起作用并且如果你在默认情况下做一些工作(所以编译器不会只是剥离它)你将有一个 100% 的 cpu 核心......不太可能有用恕我直言
  • 它并没有好转——是的,计时器可能是个好主意,但你需要使用 KeyDown/KeyUp 来设置你的标志——现在你还必须关注并发性......
  • 也许我可以设置一个普通计时器来执行我需要的操作,让我的按键循环按下,如果按下按键,将计时器设置为非活动状态。?
  • 好吧,在 UI 线程上运行循环绝对不是个好主意。如果我要实现它,我将在 UI 线程上使用带有 Inovkes 的单独线程。为了减少 CPU 负载,Thraed.Sleep 在这里很有用。无论如何,我认为计时器是他真正需要的。
  • 是的,就是这样,我会运行一个计时器,如果按下某个键,计时器将变为非活动状态,否则计时器会继续并在 10 秒后关闭程序...
猜你喜欢
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
相关资源
最近更新 更多