C# Keydown/Keyevents, если не нажата ни одна клавиша

Я сейчас что-то программирую на C#, пытаясь "преобразовать" консольное приложение в приложение Windows Forms, и я хотел сделать что-то вроде следующего:

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

В основном спрашивают, не нажимается ли какая-либо кнопка в течение некоторого времени, и this.close();

так что если не нажата ни одна клавиша, сделайте что-нибудь... Я просто не могу заставить ее работать. Я был бы очень признателен за некоторую помощь..:D

1 ответ

Если клавиша не нажата, событие KeyDown не возникает. Итак, ваш обработчик не будет вызван.

UPDATE (опция с удаленным циклом, потому что таймер сделает для вас то же самое, что и цикл в другом потоке с таймаутами ожидания):

Вот пример с таймером:

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
    }  
}
Другие вопросы по тегам