在需要长时间关注屏幕却又不想更改PC电源计划时,如观看在线视频、阅读文献资料,时间一长屏幕要不自动关闭,要不屏保自动启动,特别烦人。鄙人为此写解决这样问题的一个小工具,功能与keep display on类似,但提供了更方便的功能,如最小化为系统托盘,开机自动启动等,如下图所示:

关键代码有两点:
1. 禁用屏保
//定义API函数[DllImport("user32.dll")] static extern bool SystemParametersInfo(uint uiAction, bool uiParam, ref bool pvParam, uint fWinIni); const uint SPI_GETSCREENSAVEACTIVE = 0x0010; const uint SPI_SETSCREENSAVEACTIVE = 0x0011; const uint SPIF_SENDCHANGE = 0x0002; const uint SPIF_SENDWININICHANGE = SPIF_SENDCHANGE; //调用,其中函数内的false才是起作用的设置,active变量是在读取设置的时候使用的,这里没有实际意义。 bool active = false; SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, false, ref active, SPIF_SENDWININICHANGE);
SystemParametersinfo函数功能为查询或设置系统级参数,该函数也可以在设置参数中更新用户配置文件。
函数原型:B00L SystemParametersinfo(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinlni);
详见:http://baike.baidu.com/view/1079845.htm
2. 阻止自动关闭屏幕
//定义API函数[DllImport("kernel32.dll")] static extern uint SetThreadExecutionState(uint esFlags); const uint ES_SYSTEM_REQUIRED = 0x00000001; const uint ES_DISPLAY_REQUIRED = 0x00000002; const uint ES_CONTINUOUS = 0x80000000; //阻止自动关屏幕 SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED); //恢复自动关屏幕 SetThreadExecutionState(ES_CONTINUOUS);
SetThreadExecutionState用法和参数详见:http://msdn.microsoft.com/en-us/library/windows/desktop/aa373208(v=vs.85).aspx
如:ES_SYSTEM_REQUIRED 0×00000001
Forces the system to be in the working state by resetting the system idle timer.
强制系统处于工作状态,所以才不回自动关闭屏幕
3. 利用互斥使得程序单例执行
bool isRunning = true; Mutex m = new Mutex(true, Application.ProductName, out isRunning); if (isRunning) { Application.Run(new Form1()); ; m.ReleaseMutex(); } else { MessageBox.Show("There is an instance running already!", "Single Instance Only", MessageBoxButtons.OK); return; }
Mutex的构造方法中有三个参数:
第一个参数:true,给调用线程赋予互斥体的初始所属权
第二个参数:互斥体的名称,我们用程序的名字
第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true
注意程序关闭释放互斥变量
下载地址:
点击此处下载 (适用于装有.net framework 2.0及以上版本的x86 32位windows 系统)
如需源代码,请联系作者索取 email: bjtuterry@bjtu.edu.cn



图1. 压缩网络信息流的描述长度以发现社区结构



