Ответ 1
Я решил проблему, используя несколько различных методов, свернутых, чтобы дать мне довольно хорошее решение. Я использую GetLastInput для разработки при последнем касании системы. Это хорошо описано в другом месте, но здесь мой метод:
public static class User32Interop
{
public static TimeSpan GetLastInput()
{
var plii = new LASTINPUTINFO();
plii.cbSize = (uint)Marshal.SizeOf(plii);
if (GetLastInputInfo(ref plii))
return TimeSpan.FromMilliseconds(Environment.TickCount - plii.dwTime);
else
throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
}
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
struct LASTINPUTINFO {
public uint cbSize;
public uint dwTime;
}
}
Это говорит только о том, что система не работает, а не приложение. Если пользователь нажимает на Word и работает там в течение часа, мне все равно нужен тайм-аут. Чтобы справиться с этим случаем, я просто помню, когда мое приложение теряет фокус, переопределяя методы OnDeactivated и OnActivated в объекте приложения:
override protected void OnDeactivated(EventArgs e)
{
this._lostFocusTime = DateTime.Now;
base.OnDeactivated(e);
}
protected override void OnActivated(EventArgs e)
{
this._lostFocusTime = null;
base.OnActivated(e);
}
В объект приложения добавлена моя процедура IsIdle. Он обрабатывает глобальный случай, когда приложение имеет фокус, но ничего не произошло (IsMachineIdle) и конкретный случай, когда приложение потеряло фокус, когда пользователь делает другие вещи (isAppIdle):
public bool IsIdle
{
get
{
TimeSpan activityThreshold = TimeSpan.FromMinutes(1);
TimeSpan machineIdle = Support.User32Interop.GetLastInput();
TimeSpan? appIdle = this._lostFocusTime == null ? null : (TimeSpan?)DateTime.Now.Subtract(_lostFocusTime.Value);
bool isMachineIdle = machineIdle > activityThreshold ;
bool isAppIdle = appIdle != null && appIdle > activityThreshold ;
return isMachineIdle || isAppIdle;
}
}
Последнее, что я сделал, это создать цикл таймера, который опросил это событие флажка несколько секунд.
Кажется, что это нормально.