2012-04-05 7 views
0

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

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

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

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

+1

Что именно вы имеете в виду? Сделайте что-нибудь, если не произойдет какое-либо событие смены ключа в течение определенного времени? – alex

+0

нет так, как это 'if (" keypress == nokey ") {system.threading.thread.sleep ***} ' – Fr0stY

+1

a if-loop? можете ли вы попытаться объяснить свой вопрос более подробно, пожалуйста? –

ответ

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; 
} 

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

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 
    } 
} 
+0

большое спасибо! – Fr0stY

+0

извините, но в зависимости от того, работает ли цикл в том же потоке (вероятно, в пользовательском интерфейсе), или нет, это приведет к зависанию программы, и обработчик никогда не будет вызван - даже если это будет работать, и если вы выполните некоторую работу по умолчанию (так компилятор не просто разделит его), у вас будет один процессор cpu на 100% ... вряд ли будет полезно IMHO – Carsten

+0

это не улучшается - да, таймер может быть хорошей идеей, но вы бы хотели использовать KeyDown/KeyUp для установки ваших флагов - и теперь вы также должны быть обеспокоены параллелизмом ... – Carsten

 Смежные вопросы

  • Нет связанных вопросов^_^