我正在使用第三方Windows窗体控件,使用Application.Idle事件执行一些"延迟"操作.
现在我们将应用程序移动到WPF,这些操作停止了.我发现没有按预期引发System.Windows.Forms.Application.Idle事件.
如何在WPF应用程序中触发Idle事件,以便我可以继续使用该第三方控件(在WindowsFormsHost中)?这是不是可以修改Windows窗体控件.
我有一个应用程序,在其中 x 秒不活动后我必须注销。因此,我有一个计时器正在运行,并根据上次重置的用户活动计算时间跨度:
dtLastActivity = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)
所以问题是,我认为这不是将程序中的每个事件与上述代码相关联的最佳方法。但最终我不需要每个事件:所有有用的就是跟踪 KEYPRESS 和 MOUSEUP。
在主窗口中跟踪这两个事件是否正确?
我必须承认,我仍然没有付诸实践(但我会),因为我不确定这是否是达到标题目的的最佳方法。
作为 WPF 新手,我也不清楚在主窗口中跟踪键盘和鼠标是否不会影响子级(即实际上是事件目标的控件)的行为。
预先感谢您的任何帮助。
---编辑--- 建议的解决方案非常优雅。特别是这个:
public static class IdleTimeDetector
{
[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
public static IdleTimeInfo GetIdleTimeInfo()
{
int systemUptime = Environment.TickCount,
lastInputTicks = 0,
idleTicks = 0;
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
lastInputInfo.dwTime = 0;
if (GetLastInputInfo(ref lastInputInfo))
{
lastInputTicks = (int)lastInputInfo.dwTime;
idleTicks = systemUptime - lastInputTicks;
}
return new IdleTimeInfo
{
LastInputTime = DateTime.Now.AddMilliseconds(-1 * idleTicks), …Run Code Online (Sandbox Code Playgroud)