1

私は今c#で何かをプログラミングしていて、コンソールアプリケーションをWindowsフォームアプリケーションに「変換」しようとしています。次のようなことをしたいと思いました。

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

基本的に、キーが押されていないかどうかをしばらくスリープ状態にして、this.close();を尋ねます。

キーが押されていない場合は、何かを実行してください...私はそれを機能させることができません。私はいくつかの助けのために非常に素晴らしいでしょう..:D

4

1 に答える 1

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
    }  
}
于 2012-04-05T06:37:21.013 に答える