Проверьте демонстрацию муравьев, которая записана автором Clojure, Пятна Rich:
http://clojure.googlegroups.com/web/ants.clj
Вот является некоторыми хорошими инструкциями для получения, оно устанавливает наряду с emacs средой разработки:
Также представление Rich выезда, которое соглашается с этим кодом:
В файле Program.CS вы можете обработать событие Application.Idle и сбросить там свой таймер. См .:
http://msdn.microsoft.com/en-us/library/system.windows.forms.application.idle.aspx
Подключить обработчик событий к событиям MouseMove и KeyPressed, а затем проверить фокус внутри этого события?
В общем, было бы лучше всего получить эту информацию из логики вашего приложения, а не из необработанного пользовательского ввода, но я предполагаю, что у вас нет гибкой инфраструктуры (возможно, используя шаблон команды ), который может предоставить эту информацию.
Поэтому я предлагаю просто зарегистрировать обработчики в вашей основной форме - если вы получаете щелчки или ключевые события (для этого включите Form.KeyPreview ), ваш пользователь активен и вы можете сбросить время бездействия.
Вы можете создать базовый класс, от которого наследуются все ваши оконные формы. В базовом классе вы проверяете и сбрасываете время ожидания при каждом нажатии клавиши или щелчке.
Один из подходов, который я использовал в прошлом, - создать MessageFilter в форме приложения и проверить определенные типы событий, которые указывают на активность пользователя:
public class UserActivityFilter : IMessageFilter
{
// Define WinAPI window message values (see pinvoke.net)
private int WM_LBUTTONDOWN = 0x0201;
private int WM_MBUTTONDOWN = 0x0207;
private int WM_RBUTTONDOWN = 0x0204;
private int WM_MOUSEWHEEL = 0x020A;
private int WM_MOUSEMOVE = 0x0200;
private int WM_KEYDOWN = 0x0100;
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_MBUTTONDOWN || m.Msg == WM_RBUTTONDOWN || m.Msg == WM_MOUSEWHEEL || m.Msg == WM_MOUSEMOVE || m.Msg == WM_KEYDOWN)
{
//User activity has occurred
// Reset a flag / timer etc.
}
return false;
}
}
Затем в методе Main () формы ПЕРЕД вызовом Run ():
Application.AddMessageFilter(new UserActivityFilter());
Одно предостережение, добавление сложного фильтра сообщений или добавление нескольких отдельных фильтров может замедлить реакцию вашего приложения.
Вы можете переопределить WndProc
, обновить Program.LastActionTime
для каждого соответствующего сообщения о событии Клавиатура / мышь
.