只有当你还没有使用电脑一段时间(例如,屏幕保护程序,谷歌桌面索引等),各种程序可以做的东西。
他们如何知道什么时候不活跃? Windows中是否有一些函数可以告诉你它已经不活动了多久?还是你必须使用某种键盘/鼠标钩子来自己跟踪活动?
我正在使用C#,但是我对任何确定不活动的方法感兴趣。
我怎样才能使菜单forms留在屏幕上,在所有其他应用程序的顶部?
创build原始graphics元素(没有Windows铬)
你在哪里得到调用PowerWriteACValueIndex时使用的索引值?
在选项卡中打开.NET插件
应用程序重启API不重新启动失败的应用程序
File.copy()到同一台机器上的networking共享是否通过networking复制文件?
以编程方式通过path打印未知types的文件
Linux世界中是否有与.Net FileSystemWatcher相当的function?
将winform放置在屏幕的左下angular
使用Windows系统caching的.NET HttpRequests
编辑:改变了答案,提供了Shy的答案背后的文字和细节(应该被接受)。 随意合并和删除这一个。
GetLastInputInfo函数GetLastInputInfo函数检索上次输入事件的时间。
从P / Invoke粘贴在这里
[DllImport("user32.dll")] static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); static int GetLastInputTime() { int idleTime = 0; LASTINPUTINFO lastInputInfo = new LASTINPUTINFO(); lastInputInfo.cbSize = Marshal.SizeOf( lastInputInfo ); lastInputInfo.dwTime = 0; int envTicks = Environment.TickCount; if( GetLastInputInfo( ref lastInputInfo ) ) { int lastInputTick = lastInputInfo.dwTime; idleTime = envTicks - lastInputTick; } return (( idleTime > 0 ) ? ( idleTime / 1000 ) : idleTime ); } [StructLayout( LayoutKind.Sequential )] struct LASTINPUTINFO { public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO)); [MarshalAs(UnmanagedType.U4)] public int cbSize; [MarshalAs(UnmanagedType.U4)] public UInt32 dwTime; }
FWIW:我在AnAppADay期间实现了全局键盘和鼠标挂钩。 看到这个应用程序的来源 – 这是非常接近你想要的。 您需要的类位于AnAppADay.Utils命名空间中。 [由于linkrot划伤]
Google是你的朋友
基本上使用这个。
在使用之前不要忘记完全准备好文档。
键盘和鼠标挂钩是我发现最有价值的。 下面的类可以插入,你只需要弄清楚你想要做的关于键和鼠标更新的信息。
using System; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; namespace Example { public class Hook { delegate int HookProc(int nCode,IntPtr wParam,IntPtr lParam); [FlagsAttribute] public enum WindowMessage { WM_KEYDOWN = 0x0000000000000100,// &H100 WM_MOUSEMOVE = 0x0000000000000200,// &H200 WM_LBUTTONDOWN = 0x0000000000000201,// &H201 WM_RBUTTONDOWN = 0x0000000000000204,// &H204 WH_KEYBOARD = 2,WH_MOUSE = 7,HC_ACTION = 0 } [DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)] private static extern int CallNextHookEx(int idHook,int nCode,IntPtr lParam); [DllImport("user32.dll",CallingConvention=CallingConvention.StdCall)] private static extern bool UnhookWindowsHookEx(int idHook); [DllImport("user32.dll",CallingConvention=CallingConvention.StdCall)] private static extern int SetwindowsHookEx(int idHook,HookProc lpfn,IntPtr hInstance,int threadId); //Declare MouseHookProcedure as a HookProc type. static HookProc MouseHookProcedure; static HookProc KeyboardHookProcedure; private static int mhMouseHook = 0; private static int mhKeyboardHook = 0; public Hook() {} public static void Init() { MouseHookProcedure = new HookProc( MouseHookProc ); KeyboardHookProcedure = new HookProc( KeyboardHookProc ); mhMouseHook = SetwindowsHookEx( (int)WindowMessage.WH_MOUSE,MouseHookProcedure,(IntPtr)0,AppDomain.GetCurrentThreadId() ); mhKeyboardHook = SetwindowsHookEx( (int)WindowMessage.WH_KEYBOARD,KeyboardHookProcedure,AppDomain.GetCurrentThreadId() ); } public static void Terminate() { UnhookWindowsHookEx( mhMouseHook ); UnhookWindowsHookEx( mhKeyboardHook ); } private static int MouseHookProc( int nCode,IntPtr lParam ) { if ( nCode >= 0 ) { //do something here to update the last activity point,ie a keystroke was detected so reset our idle timer. } return CallNextHookEx( mhMouseHook,nCode,wParam,lParam ); } private static int KeyboardHookProc( int nCode,ie a mouse action was detected so reset our idle timer. } return CallNextHookEx( mhKeyboardHook,lParam ); } } }
当然,这只适用于你正在挂钩的应用程序。 如果您需要跟踪整个系统的不活动状态,则需要创建一个可以加载到所有其他窗口的地址空间中的DLL。 不幸的是,我还没有听说过会允许在这种情况下工作的.net编译的.dll文件。 我们有一个C ++ DLL挂钩为此目的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。