2

マウスの操作が行われない場合は 5 秒後に閉じたいフォームがありますが、マウスの操作が行われた場合はフォームを閉じて、操作countdown + 5 secondsごとに 5 秒増加させます。

これは私がこれまでに思いついたものです:

int countdown = 5;
System.Timers.Timer timer;

タイマーを開始

timer = new System.Timers.Timer(1000);
timer.AutoReset = true;
timer.Elapsed += new System.Timers.ElapsedEventHandler(ProcessTimerEvent);
timer.Start();

行事

private void ProcessTimerEvent(Object obj, System.Timers.ElapsedEventArgs e)
{
    --countdown;
    if (countdown == 0)
    {
        timer.Close();
        this.Invoke(new Action(() => { this.Close(); }));
    }
}

テストのために、フォームの mouseclick イベントを使用してカウントダウンを 5 増やしていますが、フォーム上のラベルまたはその他のコントロールをクリックしてもタイマーが増加しないため、別のイベントに変更する必要があります。

private void NotifierTest_MouseClick(object sender, MouseEventArgs e)
{
    countdown += 5;
}

質問

  • 正しい方法でカウンターを増やすことができるカウントダウンを実装していますか?

  • 私は何かを変更する必要がありますか?

  • 私がやったことと何か違うとしたら、どうやってこれをしますか?

  • マウス クリック キャプチャをどのように処理すればよいですか?

  • 低レベルのフックを使用していますか?

  • マウスのクリック位置を使用して、それが私の winform にあるかどうかを確認しますか?

その他のオプション

私が現在考えている別のオプションは、マウスがフォーム領域内にあるかどうかをキャプチャし、領域内にない場合はクローズカウントダウンを有効/無効にすることですが、これのためにマウスを操作する方法がわかりません。マウスをどのように操作するかについての上記の質問。

4

1 に答える 1

3

本質的に、あなたがしていることは問題ないと思います。本当のトリックは、マウスイベントを処理することです。

マウスがウィンドウのクライアント領域にあるかどうかを確認するだけでこれを行う方法の簡単で汚い例を次に示します。基本的に、タイマーが満了するたびに、コードは画面上のマウスの位置を取得し、それがウィンドウのクライアント領域と重なるかどうかを確認します。おそらく、ウィンドウがアクティブかどうかなども確認する必要がありますが、これは妥当な出発点です。

using System;
using System.Windows.Forms;
using System.Timers;
using System.Drawing;

namespace WinFormsAutoClose
{
  public partial class Form1 : Form
  {
    int _countDown = 5;
    System.Timers.Timer _timer;

    public Form1()
    {
      InitializeComponent();

      _timer = new System.Timers.Timer(1000);
      _timer.AutoReset = true;
      _timer.Elapsed += new ElapsedEventHandler(ProcessTimerEvent);
      _timer.Start();
    }

    private void ProcessTimerEvent(Object obj, System.Timers.ElapsedEventArgs e) 
    {
      Invoke(new Action(() => { ProcessTimerEventMarshaled(); }));
    }

    private void ProcessTimerEventMarshaled()
    {
      if (!IsMouseInWindow())
      {
        --_countDown;
        if (_countDown == 0)
        {
          _timer.Close();
          this.Close();
        }
      }
      else
      {
        _countDown = 5;
      }
    }

    private bool IsMouseInWindow()
    {
      Point clientPoint = PointToClient(Cursor.Position);
      return ClientRectangle.Contains(clientPoint);
    }
  }
}
于 2011-04-25T13:45:44.900 に答える