[C#] マウス停止時、数秒後にカーソルを消す

投稿


マウスをしばらく動かさずにいると、マウスカーソルを消したい。
マウスカーソルの表示/非表示は、System.Windows.Forms.CursorクラスShow/Hideメソッドを使えばよい。
秒数管理は、System.Windows.Forms.Timerクラスを使う。

※注意点
Cursorクラスは内部にShow/Hideメソッドを呼んだカウントを持っており、それを見て表示/非表示を制御しています。
例えば、Hideメソッドを2回呼んだら、Showメソッドも2回呼ぶまで、カーソルは表示されません。
つまりShow/Hideメソッドを呼んだ回数が対応していないと、期待通りに表示/非表示できません。

また、マウスが動いた時にカーソルを再表示させるのに、MouseMoveイベントを使うのですが、
マウスが動いていない場合でも、MouseEventが呼ばれることがあるので、
カーソルの前回位置を覚えておいて、今回位置と比べて位置が同じなら再表示しないようにします。
 


 
以下、Form1上で、4秒間マウスを動かさないと、マウスカーソルを非表示にするコード

public partial class Form1 : Form
{
    private readonly Timer cursorTimer;     // カーソルを隠すためのタイマー
    private const int      HIDE_CURSOR_TIME = 4000; // カーソルを隠すミリ秒数
    private bool           isHiddenCursor;  // カーソルが隠れているか
    private Point          previousPoint;   // 前回のカーソル位置

    public Form1()
    {
        InitializeComponent();  // これはVisual Studioが自動生成したコード

        this.isHiddenCursor = false;
        this.previousPoint  = Cursor.Position;

        // カーソルを隠すためのタイマー生成
        this.cursorTimer = new Timer();
        this.cursorTimer.Interval = HIDE_CURSOR_TIME;

        // タイマーイベント
        this.cursorTimer.Tick += (sender, e) =>
            {
                this.cursorTimer.Stop();

                if (!this.isHiddenCursor)
                {
                    // カーソルが隠れていない時のみ、カーソルを隠す
                    Cursor.Hide();
                    this.isHiddenCursor = true;
                }
            };

        // マウス移動イベント
        this.MouseMove += (sender, e) =>
            {
                if (this.previousPoint == Cursor.Position)
                {
                    // 前回と今回のカーソル位置が同じ場合は何もしない
                    return;
                }
                this.previousPoint = Cursor.Position;

                this.cursorTimer.Stop();
                if (this.isHiddenCursor)
                {
                    // カーソルが隠れている時のみ、カーソルを表示する
                    Cursor.Show();
                    this.isHiddenCursor = false;
                }
                this.cursorTimer.Start();
            };

        this.cursorTimer.Start();
    }
}




コメントを残す

メールアドレスが公開されることはありません。