C#调用WinApi关闭电脑屏幕含自动监视有无输入活动检测
说到这儿啊,我要吐个槽,做程序的,没一个不苦逼的.
闲话少说,开始吧.有人会说,我系统自带电源管理,我干嘛,还要自己写个程序来控制呢,"大哥,你是知道的,做程序的就爱折腾,要么折腾自己,要么让别人来折腾自己,不爱折腾的程序员不是好程序员".
首先我们要获取要得到关闭显示器的方法,.net库中虽然没有这个方法,但系统API中肯定是有的三.与非托管代码交互,"System.Runtime.InteropServices"这个命名空间是少不了的三.
上代码了.
/// <param name="lParam">2 为关闭显示器,-1则打开显示器 </param> [DllImport("user32")] public static extern IntPtr SendMessage(IntPtr hWnd, uint wMsg, uint wParam, int lParam); /// <summary> /// 锁定计算机 /// </summary> [DllImport("user32.dll")] public static extern void LockWorkStation();
第二步,监视键盘鼠标.Windows共有14种Hooks,每一种类型的Hook可以使应用程序能够监视不同类型的系统消息处理机制.这里只讨论键盘鼠标钩子.
这一步其实也不难,不就是全局勾子嘛,这个钩子嘛,可不是说人类或动物的屁股哦,简单的说吧,大家都知道Windows是基于消息的一个操作系统而钩子可以用来截获系统中的消息流.爽不爽,想想那些木马盗号软件就知道了.
注册钩子
注册钩子
1 /// <summary> 2 /// 安装钩子 3 /// </summary> 4 /// <param name="idHook">系统钩子类型,14为鼠标钩子,13为键盘钩子</param> 5 /// <param name="lpfn">钩子回调函数指针,当收到钩子消息时就执行这个回调函数,回调函数有3个参数,不同类型的钩子这3个参数有不同的含义</param> 6 /// <param name="pInstance">应用程序实例的句柄,标识包含lpfn所指的子程的DLL</param> 7 /// <param name="threadId">与安装的钩子子程相关联的线程的标识符,如果为0,钩子子程与所有的线程关联,即为全局钩子</param> 8 /// <returns></returns> 9 [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)] 10 public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr pInstance, int threadId); 11 12 /// <summary> 13 /// 钩子委托声明 14 /// </summary> 15 public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);