2012-05-08 1 views
2

Я пытаюсь разработать приложение, которое при запуске скроет курсор мыши, где бы он ни находился на экране после 5 секунд бездействия , даже если мое приложение не находится на переднем плане. Затем, как только мышь перемещается снова, мышь должна появиться мгновенно.On Idle Hide Mouse System-Wide, Show on Movement, из приложения 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

И я, кажется, чтобы получить ближе с этим: 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 секунд, чтобы мышь снова появилась! Будет ли решение просто иметь два отдельных таймера и отдельные события?

Большое спасибо за помощь!

ответ

1

Вам не нужно создавать 2 разных таймера. Я бы использовал один и тот же таймер, но имел переменную частного члена, которая отслеживает, скрыт ли курсор. Как только вы скроете его, вы можете сбросить таймер на более короткий (скажем 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 события в вашей форме затем вызвать Cursor.Show() в MouseMove обработчика.

+0

Хорошая идея. Таким образом, вы можете уничтожить оригинальный таймер, если хотите. – MrWuf