设置屏保程序注解
((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
//IDM_ABOUTBOX注解:
只有在主窗口是对话框的MFC应用程序中才会出现这个消息。
IDM_ABOUTBOX是MFC框架在“InitDialog”函数中加入的“系统菜单”消息,用来弹出“IDD_ABOUTBOX”指定的对话框。
关于((nID & 0xFFF0) == IDM_ABOUTBOX):
在MSDN中SysCommand的帮助中,有这样一段:
In WM_SYSCOMMAND messages, the four low-order bits of the nID parameter are used internally by Windows. When an application tests the value of nID, it must combine the value 0xFFF0 with the nID value by using the bitwise-AND operator to obtain the correct result.
systemCommand的用处:用于响应系统菜单的命令消息.此时可以在系统的菜单中加入自己的菜单命令消息,即上面的IDM_aboutbox.
在响应的时候,可以根据命令ID的不同选择响应模式:
if ((nID & 0xFFF0) == IDM_ABOUTBOX)//如果命令id不再系统id范围之内.则自定义响应函数
{ //用0xFFF0是因为,ID的底四节默认是windows使用的id.
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);//否则就需要调用系统默认的响应系统命令函数.
}
//
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}//向系统菜单里面追加一项"关于"菜单
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon,ALT+TAB时显示大图标,否则显示为系统默认的图标
SetIcon(m_hIcon, FALSE); // Set small icon,运行时窗口的图标
// TODO: Add extra initialization here
CSpinButtonCtrl *pSpin=(CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_SCREENTIME);
pSpin->SetRange(1,60); // 设置数据范围到60分钟
//下面开始从注册表中读取当前设置屏保响应时间和checkbox的状态值
HKEY hkey;
LPCTSTR path="Control Panel\\Desktop"; //设置要打开的子键值,主键在regopenkeyex中指定.
long ret=::RegOpenKeyEx(HKEY_CURRENT_USER,path,0,KEY_QUERY_VALUE,&hkey);
if(ret!=ERROR_SUCCESS)
{
MessageBox("错误,无法打开相关的HKEY");
OnCancel();
}
char tmp[256]="\0";
DWORD type=REG_SZ;
DWORD size=256;
ret=::RegQueryValueEx(hkey,"ScreenSaveTimeOut",NULL,&type,(unsigned char *)tmp,&size);
if(ret!=ERROR_SUCCESS) //屏保响应时间保存在ScreensaveTimeout里面
{
MessageBox("错误,无法读取相关的HKEY1");
::RegCloseKey(hkey);
OnCancel();
}
m_time=atoi(tmp)/60;
pSpin->SetPos(m_time);
ret=::RegQueryValueEx(hkey,"ScreenSaverIsSecure",NULL,&type,(unsigned char *)tmp,&size);
if(ret!=ERROR_SUCCESS) //ScreenSaverIsSecure保存了是否恢复是需要回到登陆界面
{
MessageBox("错误,无法读取相关的HKEY2");
::RegCloseKey(hkey);
OnCancel();
}
if(strcmp(tmp,"1")==0)
m_password=TRUE;
UpdateData(FALSE);
ret=::RegQueryValueEx(hkey,"ScreenSaveActive",NULL,&type,(unsigned char *)tmp,&size);
if(ret!=ERROR_SUCCESS) //查询当前是否设置了屏保,如果查询成功返回ERROR_SUCCESS.
{
MessageBox("错误,无法读取相关的HKEY1");
::RegCloseKey(hkey);
OnCancel();
}
if(strcmp(tmp,"1")!=0)//屏保无效,将一些控件使能失效
{
m_ScreenName.SetCurSel(m_ScreenName.AddString("(无)"));
GetDlgItem(IDC_SCREEN_TIME)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_PASSWORD)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC1)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC2)->EnableWindow(FALSE);
GetDlgItem(IDC_SETSC)->EnableWindow(FALSE);
GetDlgItem(IDC_SCREEN_BROWER)->EnableWindow(FALSE);
}
else
m_ScreenName.AddString("(无)");
m_ScrnSave.Add("(无)");
size=256;
ret=::RegQueryValueEx(hkey,"SCRNSAVE.EXE",NULL,&type,(unsigned char *)tmp,&size);//查询当前使用的是哪个屏保
::RegCloseKey(hkey);//使用完之后关闭打开的键值
//从此开始文件的查找过程,先在系统目录里面查找所有scr文件
HANDLE hFind;
WIN32_FIND_DATA pdata;
char system[256]="\0";
GetSystemDirectory(system,256);//获取当前系统目录:如?"c:\windows\system32"注意,返回的目录最后不带反斜杠的.所以需要后面的\\*.scr.
strcat(system,"\\*.scr");
hFind=FindFirstFile(system,&pdata);//系统的查找文件函数,将找到的第一个文件信息传给pdata.返回值hFind用以进行后续查找使用
if(INVALID_HANDLE_VALUE!=hFind)//如果查找失败会返回一个INVALID_HANDLE_VALUE的值
{
do{
char a[256];
int i;
GetSystemDirectory(a,256);
strcat(a,"\\");
strcat(a,pdata.cFileName);//至此已经把找到的文件名保存起来了.
//这一段被我用if(0)跳过了
HINSTANCE h=LoadLibraryEx(a,NULL,LOAD_LIBRARY_AS_DATAFILE);//从文件模块中状态其DLL模块
if(0)
{
CString a;
LoadString(h,1,a.GetBuffer(256),256);//从装载的DLL模块取得程序名.
i=m_ScreenName.AddString(a);
}
else
i=m_ScreenName.AddString(pdata.cFileName);
FreeLibrary(h);
//这一段程序很明了,可是很奇怪为什么要多次一举,并且采用这种方式并不能从所有的dll文件中获取其文件名.至少在我测试的梦想水族馆的屏保通过这种方式获取
//文件名就失败了. 且省略掉这段用常用的查找文件方式可以添加所有的文件
m_ScrnSave.Add(a);
if(strcmp(a,tmp)==0)
if(m_ScreenName.GetCurSel()!=0)
m_ScreenName.SetCurSel(i); //如果找到的屏保名和当前使用的屏保名相同,用组合框选中.
}while(FindNextFile(hFind,&pdata));
}
FindClose(hFind);
GetDlgItem(IDC_APPLY)->EnaeWblindow(FALSE);
m_Buttok=TRUE;
return TRUE;