C#, Как долго пользователь был неактивен

Проверьте демонстрацию муравьев, которая записана автором Clojure, Пятна Rich:

http://clojure.googlegroups.com/web/ants.clj

Вот является некоторыми хорошими инструкциями для получения, оно устанавливает наряду с emacs средой разработки:

http://riddell.us/clojure

Также представление Rich выезда, которое соглашается с этим кодом:

http://blip.tv/file/812787

9
задан David Basarab 14 September 2009 в 13:08
поделиться

6 ответов

В файле Program.CS вы можете обработать событие Application.Idle и сбросить там свой таймер. См .:

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.idle.aspx

2
ответ дан 4 December 2019 в 21:50
поделиться

Подключить обработчик событий к событиям MouseMove и KeyPressed, а затем проверить фокус внутри этого события?

0
ответ дан 4 December 2019 в 21:50
поделиться

В общем, было бы лучше всего получить эту информацию из логики вашего приложения, а не из необработанного пользовательского ввода, но я предполагаю, что у вас нет гибкой инфраструктуры (возможно, используя шаблон команды ), который может предоставить эту информацию.

Поэтому я предлагаю просто зарегистрировать обработчики в вашей основной форме - если вы получаете щелчки или ключевые события (для этого включите Form.KeyPreview ), ваш пользователь активен и вы можете сбросить время бездействия.

0
ответ дан 4 December 2019 в 21:50
поделиться

Вы можете создать базовый класс, от которого наследуются все ваши оконные формы. В базовом классе вы проверяете и сбрасываете время ожидания при каждом нажатии клавиши или щелчке.

0
ответ дан 4 December 2019 в 21:50
поделиться

Один из подходов, который я использовал в прошлом, - создать 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());

Одно предостережение, добавление сложного фильтра сообщений или добавление нескольких отдельных фильтров может замедлить реакцию вашего приложения.

6
ответ дан 4 December 2019 в 21:50
поделиться

Вы можете переопределить WndProc , обновить Program.LastActionTime для каждого соответствующего сообщения о событии Клавиатура / мышь .

1
ответ дан 4 December 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: