Windows 屏幕保护程序和启动管理器






2.83/5 (5投票s)
1999 年 12 月 2 日
5分钟阅读

88478

1234
该程序可以启用/禁用/激活当前活动的屏幕保护程序,并提供注销 Windows 和/或重启计算机的功能。
图例:function = 函数;program = 程序;SS = 屏幕保护程序;var = 变量;Win = Windows;
WinMgr (Windows Manager) 该程序执行以下操作
- 通过调用
SytemParametersInfo
函数来启用/禁用/激活当前活动的屏幕保护程序。 - 使用配置文件保存两项用户选项……存储在“Windows”目录下的“WinMgr.ini”文件中。
- 演示如何注销 Windows 和/或重启计算机(两个独立的按钮)
- 在对话框中使用文件菜单系统
- 从对话框系统菜单和/或对话框的文件菜单调用“帮助..关于”。
- 通过代码将文本填充到编辑框中(参见
CInfoDlg::OnInitDialog
函数)
请仔细查看 Onbuttonnable
、Onbuttondisable
和 CheckSSStatus
函数。这段代码应该相当直接,而且我的大部分代码都得到了充分的注释,因为我是一名断断续续的程序员。
这是我第二个 Win32 程序的增强版本,也是我用 C++/VC++ 编写的第二个程序。上次编程时,我还在使用 Pascal,在 386 SX-16 上运行 MS-DOS 5.0 和 Win 3.1!
您可以使用此代码以任何您想要的方式,但我请求您通过电子邮件通知我您使用了此代码,并提供您的返回电子邮件地址,以便我回复您。我只想知道有多少人正在使用它。
请发送您可能有的任何改进、错误报告、投诉或修改……因为我是一名初学者。我叫 Marc,我的电子邮件是:mehowe@yahoo.com。如果我在我编写的任何程序中使用您的修改,您将获得署名。
编写此程序是因为我刻录 CD-R,并且为了避免传输中断,在刻录期间应禁用屏幕保护程序。我不想每次都去桌面右键单击打开显示属性或从开始菜单打开控制面板。实际上,我只是想看看我是否能编写一个小工具来完成各种有用的 Windows 任务。
我在 CodeProject 上没有找到关于此问题的文章,所以这里是代码。
此代码也应该在 UNICODE 下运行。我只在两台运行 Win '98 的机器上测试过。根据 MSDN 文档,此代码将在 NT 4.0 上运行。由于 NT 4.0 不支持 USB,我仍然使用 Win '98……等待 Win 2000 Professional,因为据我所知,它是 NT 的 Win 2000 版本。
此代码是用 MSVC++ 6.0 Pro Edition(带 SR-3 更新)编写的。
代码概述
注意:在 WinMgr 的项目设置中,我将 MFC 用作静态链接库。这会导致编译器在设置为 4 级错误检查状态时发出以下两个警告
LINK : warning LNK4089: all references to "SHELL32.dll" discarded by /OPT:REF LINK : warning LNK4089: all references to "comdlg32.dll" discarded by /OPT:REF
如果您收到其中任何一个警告,您可以忽略它们(根据文档)。这只是在告诉您 MFC 被用作静态链接库。
现在,进入正题。首先,InitDialog 函数调用 CheckSSStatus
函数来确定当前的屏幕保护程序状态,并使用屏幕保护程序状态值更新对话框的编辑框。
接下来,如果按下“启用”按钮,则调用 Onbuttonenable
函数。有关详细信息,请参见该函数。
“禁用”按钮调用 Onbuttondisable 函数,其工作方式与 Onbuttonenable
函数相同,只是发送 FALSE 值来禁用当前屏幕保护程序。
CheckSSStatus
函数的初始化方式与上述函数基本相同。但是,它还将一个名为 m_strEditSSStatus
的 CString
成员变量设置为“ENABLED”或“DISABLED”,具体取决于屏幕保护程序的当前状态,然后将其发送到对话框的编辑框。然后,它会更新对话框的显示,向用户显示当前的屏幕保护程序状态。
void CWinMgrDlg::OnButtonenabless() { // TODO: Add your control notification handler code here // NOTE: The following code was corrected by Kunz Dieter...Thanks! //declare local bool variable for the SystemParametersInfo func() BOOL pvParam; BOOL l_RetVal_b = SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &pvParam, 0); // the function call was ok - only in this case the pvParam holds // valid data if(l_RetVal_b) { if (pvParam != FALSE){ //If SS already enabled, do nothing } //end if //If SS disabled, enable it else if (pvParam == FALSE){ //Enable screen saving capability for the current user session SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, 0, 0); //Call CheckSSStatus() function to check performance of // SystemParameterInfo() function & update the dialog's // display with current SS status CheckSSStatus(); } //end else if } //end top if } //end OnButtonenabless() void CWinMgrDlg::CheckSSStatus(void) { BOOL pvParam; //declare local bool variable for the //SystemParametersInfo func() BOOL l_RetVal_b = SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &pvParam, 0); // the function call was ok - only in this case the pvParam // holds valid data if(l_RetVal_b) { if (pvParam == FALSE){ //If SS disabled, send "DISABLED" to read-only // edit control and update the display //m_EditSSStatus is a member Cstring var for the dialog's // edit box m_strEditSSStatus = "DISABLED"; UpdateData(FALSE); } //end if //NOTE: also tried pvParam here as test value else if (pvParam != FALSE) { //If SS enabled, send "ENABLED" to read-only edit control and // update the display m_strEditSSStatus = "ENABLED"; //m_EditSSStatus is a member // Cstring var for the dialog's // edit box UpdateData(FALSE); } //end else if } //end top if } //end CheckSSStatus() void CWinMgrDlg::OnButtonactivatess() { // TODO: Add your control notification handler code here //Add code to check the state of the two check boxes for //ActivateSS options //if() int ActSSVal; ActSSVal = m_dConfigDlg.m_iSSValue; switch(ActSSVal) { case 0: //Exit radio button ActivateSS(); OnOK(); //Now Exit WinMgr break; case 1: //Minimize radio button ShowWindow(SW_MINIMIZE); ActivateSS(); break; } } //End OnButtonactivatess() void CWinMgrDlg::ActivateSS(void) { /*** Code contributed by anonymous source on CodeGuru discussion board...Thank You!***/ CDialog dlg; //Create temp modal dialog //Create temp dialog using IDD_LAUNCHSS_DLG dlg dlg.Create(IDD_LAUNCHSS_DLG); //send SysCommand message calling SS dlg.SendMessage(WM_SYSCOMMAND, SC_SCREENSAVE); dlg.DestroyWindow(); //destroy temporary dialog window //**Notice no call to DoModal()...therefore no window is shown** //Other way to activate SS...doesn't work here //OnSysCommand(SC_SCREENSAVE, SC_SCREENSAVE); }
最后说明
局限性
- (故意) 一旦按下按钮,屏幕保护程序的启用/禁用操作就会执行……无法取消。此程序旨在简单易用。用户必须使用另一个按钮来重置屏幕保护程序,或者通过桌面或控制面板进入显示属性进行更改。
- (故意) 没有“确定”或“取消”按钮,因为 ESC 键或系统标题栏上的“[X]”按钮将关闭程序。程序不会故意截获 ESC 键。如果您想要一些代码来截获 ESC 键,请告诉我。
系统要求:
运行时占用约 200K RAM。可能在任何 Win'9x 或 Win NT 系统上运行……请参见下方的“测试环境”。
测试环境:两台运行 Win'98 的 Pentium II 机器。这些机器还运行免费的 CPU 冷却实用程序“RAIN”——我强烈推荐任何使用 Win'9x 的用户使用此 CPU 冷却程序。Win NT 4.0 已经有一个内置的 CPU 冷却例程作为其操作系统的一部分。这两个系统都没有出现与 RAIN 的任何冲突!我与 RAIN 程序员没有任何关系,我只是向任何使用 Win '9x Pentium II(或更高版本)机器的用户推荐它,因为这些 CPU 由于其高时钟速度而变得非常热!
法律/保修:
本软件由 Marc E. Howe 于 1999 年拥有版权,保留所有权利。作者对 WinMgr 软件的任何使用均不作任何明示或暗示的保证。用户对使用本软件造成的任何及所有损害承担全部责任。作者对消费者使用本软件的任何责任完全免除。您可以使用此代码以任何您想要的方式,但作者请求您通过电子邮件通知他您使用了此代码,并提供您的返回电子邮件地址,以便作者回复。通过使用本软件,您同意上述法律/保修声明中的所有条款。
发送电子邮件至 Marc:mehowe@yahoo.com
(C) 1999 年 Marc E. Howe 版权所有,保留所有权利。
和平、荣誉与尊重,
Marc