2016-05-13 2 views
3

Чтобы определить, если компьютер не использовался в течение определенного времени, я использую метод Win32API.GetLastInputTime(). Я просто вычитаю его значение из DateTime.Now и сравниваю его с некоторым значением, хранящимся в настройках.GetLastInputTime показывает невозможное время?

Он работал отлично до этого, но недавно GetLastInputTime начал показывать совершенно нелепые результаты - это показывает мне будущее. Сегодня он показывает мне 2 июля 2016 года.

Итак, есть ли у кого-нибудь идеи, что происходит? Как GetLastInputTime получить время, и как это возможно, что на этот раз будущее?

+2

Вероятно, - или, скорее, может быть, - есть что-то не так с обработкой 'DateTime' класса. Обратите внимание, что 02/07/2016 можно прочитать как 2 июля 2016 года или 7 февраля 2016 года. Но без дополнительной информации трудно сказать, является ли это проблемой. – Ian

+1

Другая возможность заключается в том, что 'GetLastInputTime' возвращает * тики *, которые подвержены выхлопу:« ... время будет обнулено до нуля, если система будет работать непрерывно в течение 49.7 дней ... »https://msdn.microsoft. ком/EN-US/библиотека/окна/настольные/ms724408 (v = vs.85) .aspx; обратите внимание, что '13 мая 2016 года +49,7 дня' ==' 2 июля 2016 года –

+2

Вычитание из DateTime.Now бессмысленно, что дает дату перезагрузки машины. Вы должны отдать его на * int * и вычесть его из Environment.TickCount. Который производит число миллисекунд с момента последнего события ввода. –

ответ

6

С GetLastInputTime возвращается клещей в UInt32 (DWORD)

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724408(v=vs.85).aspx

вы можете иметь целочисленное переполнение :

истекшее время сохраняется в качестве значения параметра DWORD. Поэтому время будет обертываться до нуля, если система работает непрерывно для 49,7 дней. Чтобы избежать этой проблемы, используйте функцию GetTickCount64. В противном случае проверяет состояние переполнения при сравнении времени.

И, таким образом, имеют будущие даты:

13 May 2016 + 49.7 days == 2 July 2016 
+0

Хорошо, я адаптировал свой код для использования GetLastInputInfo и Environment.TickCount. Спасибо за то, что я выделил суть проблемы. – lentinant

1

Я думаю, вы не можете использовать DateTime.Now, потому что это зависит от часового пояса.

Как описано here, вы должны использовать Environment.TickCount, чтобы получить простоя.

+0

Это правда, что 'DateTime.Now' зависит от часового пояса - так же, как вы говорите. Но результат, получаемый OP, слишком далек даже для разных часовых поясов. Вероятно, проблема заключается не в использовании 'DateTime.Now', а во всей обработке' DateTime'. В любом случае, без дополнительной информации, это трудно сказать. – Ian

Смежные вопросы