我想做一個功能,如果用戶閒置一段時間,會超時並導航到主頁面。經過一番研究,我發現ThreadPoolTimer應該適合我的需求。測試它我決定使用10秒的時間間隔。如何檢查用戶是否在UWP上空閒?
timer =ThreadPoolTimer.CreatePeriodicTimer(Timer_Tick,TimeSpan.FromSeconds(10));
而這就是我無所適從的地方。我找不到一種方法來檢查UWP上的用戶輸入,而無需單獨檢查PointerPressed,PointerExited等。因此,我做了一些更深入的挖掘,並且發現了一段代碼,如果用戶想要給你一個布爾值閒置或不閒。
public static uint GetIdleTime()
{
LASTINPUTINFO lastInPut = new LASTINPUTINFO();
lastInPut.cbSize = (uint)Marshal.SizeOf(lastInPut);
GetLastInputInfo(ref lastInPut);
return ((uint)Environment.TickCount - lastInPut.dwTime);
}
public static bool IsUserIdle()
{
uint idleTime = (uint)Environment.TickCount - GetLastInputEventTickCount();
if (idleTime > 0)
{
idleTime = (idleTime/1000);
}
else
{
idleTime = 0;
}
//user is idle for 10 sec
bool b = (idleTime >= 10);
return b;
}
private static uint GetLastInputEventTickCount()
{
LASTINPUTINFO lii = new LASTINPUTINFO();
lii.cbSize = (uint)Marshal.SizeOf(lii);
lii.dwTime = 0;
uint p = GetLastInputInfo(ref lii) ? lii.dwTime : 0;
return p;
}
[StructLayout(LayoutKind.Sequential)]
private struct LASTINPUTINFO
{
public static readonly int SizeOf = Marshal.SizeOf<LASTINPUTINFO>();
[MarshalAs(UnmanagedType.U4)]
public UInt32 cbSize;
[MarshalAs(UnmanagedType.U4)]
public UInt32 dwTime;
}
[DllImport("user32.dll")]
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
我然後調用打鉤功能的功能和使用條件語句如果IsUserIdle()等於真然後導航到主頁。
public static void Timer_Tick(object sender)
{
if (IsUserIdle() == true)
{
Frame.Navigate(typeof(MainPage));
}
}
但是,當我開始也沒有任何反應,之後我設置幾個斷點我發現IsUserIdle()從來沒有後閒置10秒返回真值。我完全卡住,所以任何幫助將不勝感激。
對不起,我輸入得太快了。原始代碼應該是bool b =(idleTime> = 10); @gravity –