class UserActivity : IMessageFilter { private double afk_time = 0.1;//minutes private DateTime last_activity = DateTime.Now; public static bool inactive = false; 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) { this.last_activity = DateTime.Now; inactive = false; } if (DateTime.Now.AddMinutes(-afk_time) > last_activity) inactive = true; return false; } }
但是我必须在Program.cs中运行它
Application.AddMessageFilter(new UserActivity());
我怎么做,我可以通过我自己运行检查用户不活动。 我会检查一些checkBox,它会开始检查。
我想检查全球用户活动 – 在所有系统不仅在应用程序。
获取Cassini以在本地计算机上工作时出错
C#,Windows服务和Microsoft.Bcl.Async
禁用特定的USB存储设备C#
我不想使用cpu不必要的。 还是应该使用另一种解决scheme?
如何在Windows窗体上显示必填字段
以编程方式更改IE开发人员工具用户代理设置
如何将标签或其他元素dynamic地添加到Windows窗体面板?
如何从.NET文件对话框中获得映射networking驱动器的path
应用程序重启API不重新启动失败的应用程序
我发现这个,它完美的作品! 所以如果另一个人有问题,这里是解决方案:
[StructLayout(LayoutKind.Sequential)] public struct LASTINPUTINFO { public uint cbSize; public uint dwTime; } [DllImport("user32.dll")] static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); public static TimeSpan? GetInactiveTime() { LASTINPUTINFO info = new LASTINPUTINFO(); info.cbSize = (uint)Marshal.SizeOf(info); if (GetLastInputInfo(ref info)) return TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime); else return null; }
我试图建立一个基于以前的答案,我已经测试它,它正常工作。 这是异步的,但我没有使用异步密钥。 如果有人发现一些问题或改善如此受欢迎。
public class User { [StructLayout(LayoutKind.Sequential)] public struct LASTINPUTINFO { public uint cbSize; public uint dwTime; } [DllImport("user32.dll")] static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); public static TimeSpan? GetInactiveTime() { LASTINPUTINFO info = new LASTINPUTINFO(); info.cbSize = (uint)Marshal.SizeOf(info); if (GetLastInputInfo(ref info)) return TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime); else return null; } private TimeSpan? LastTime; private dispatcherTimer timer = new dispatcherTimer(); public void RequestUserActivity() { LastTime = GetInactiveTime(); timer.Interval = TimeSpan.FromMilliseconds(500); timer.Tick += timer_Tick; timer.Start(); } void timer_Tick(object sender,EventArgs e) { TimeSpan? tmpTime = GetInactiveTime(); if (LastTime.HasValue && tmpTime.HasValue && tmpTime < LastTime) { timer.Stop(); UserAtivited(this,new EventArgs()); } else if (!LastTime.HasValue || !tmpTime.HasValue) { timer.Stop(); throw new Exception(); } } public event EventHandler UserAtivited; }
现在在你的窗口中创建一个新的User实例,注册到UserActivated事件,并且笑话RequestUserActivity()。 我认为这将是有益的。
请不要对我差劲的英语表示敬意。 我是法语发言者。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。