2012-05-08 13 views
2

私は、実行中にマウスカーソルが5秒間何も操作されずに画面上に表示されるようなアプリケーションを開発しようとしています私のアプリがフォアグラウンドにいなくても。その後、マウスが再び動くと、マウスは直ちに再び現れるはずです。アイドル時マウスシステム全体を隠す、C#アプリケーションから移動時に表示

私は低レベルのマウスフックについて多くのことを読んできましたが、私にはコードをもっと読みにくくするデリゲートとコールバックの周りに私の頭を包んでいるように見えません。ここで

は、私は解決策の観点で見てきたものの一部です:

Hide mouse cursor after an idle time

http://blogs.msdn.com/b/toub/archive/2006/05/03/589468.aspx http://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C

そして、私はこの1つに最も近い得るように見えた: http://weblogs.asp.net/jdanforth/archive/2011/03/19/detecting-idle-time-with-global-mouse-and-keyboard-hooks-in-wpf.aspx

私の問題は、5秒間メインフォームにタイマーを設定した場合、マウスのdiそれらが5秒後に消えてしまった場合、それは非アクティブですが、マウスが再び現れるまで5秒かかります!ソリューションは単に2つの別々のタイマーと別々のイベントを持つだけでしょうか?

ありがとうございました。

答えて

1

2つの異なるタイマーを作成する必要はありません。私は同じタイマーを使用しますが、カーソルが隠されているかどうかを追跡するprivateメンバー変数を持っています。それを隠すと、タイマーをもっと短く(たとえば500ミリ秒)リセットして、それを元に戻して再びオンにすることができます。

あなたはこれを試すことができます。

private Timer t; 
void OnLoad(object sender, EventArgs e) 
{ 
    t = new Timer(); 
    t.Interval = 5000; 
    t.Tick += new EventHandler(t_Tick); 
} 

private bool _hidden = false; 

void t_Tick(object sender, EventArgs e) 
{ 
    if(!_hidden) 
    { 
     Cursor.Hide(); 
     t.Interval = 500; 
    } 
    else 
    { 
     if(--some parameter---) 
       Cursor.Show(); 
    } 
} 
+1

賢い!ありがとう! –

+1

私の答えにちょっとしたコードを追加しました。 – MrWuf

+0

ありがとうございましたが、私が思ったコードが正しく動作していないと思っています。私の予想以上にマウスが隠れてしまいます。これは私の意図した動作ではありません。私はそれがWinAPIに掘り下げる時間だと思います... –

3

は、フォーム上のMouseMoveイベントのハンドラを追加し、その後MouseMoveハンドラでCursor.Show()を呼び出します。

+0

良いアイデア。あなたが望むなら、その方法で元のタイマーを破壊することができます。 – MrWuf

関連する問題