MFC设置电脑屏保的问题

芊芊绝唱 2013-11-09 11:54:23
现在已经实现了按下按钮后选择一张图片然后立即实现屏保效果,只是把屏幕背景刷黑然后贴图而已。。。
问题是,这样操作结束等到电脑真正的屏保时间到了之后,屏保又换成了系统的屏保效果。
所以,请问大家有没有办法,在系统有设置屏保效果的前提下,让电脑到了屏保时间也使用我选择的那张图片?
比如我按下那个按钮后,效果出来了,然后我又随便操作一下电脑又恢复了,然后我什么也不动,等电脑屏保时间到了以后,电脑还是用的我刚才设置的图片,然后我点按钮换一张图,下次电脑屏保也变成我新换的图?
这是不是要涉及到注册表或者修改电脑的工作状态之类的啊。。求指点
...全文
211 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wshlwz 2015-02-05
  • 打赏
  • 举报
回复
引用 4 楼 Me_Not_You 的回复:
我想过用FindWindow,但是担心其他操作系统(比如Win7和Win8)的这个对话框的类名或窗口名有变。。。
我也想过同样的问题,求高手指点
芊芊绝唱 2013-11-17
  • 打赏
  • 举报
回复
我想过用FindWindow,但是担心其他操作系统(比如Win7和Win8)的这个对话框的类名或窗口名有变。。。
芊芊绝唱 2013-11-17
  • 打赏
  • 举报
回复
引用 2 楼 CometNet 的回复:
//安装屏保
//1.取出当前运行EXE的完整路径
//2.复制到系统目录下(复制后的扩展名为.scr)
//3.调用 rundll32.exe 安装屏保
//注:在Vista/Win7等系统需要管理员权限
BOOL SetupScreen(void)
{
CString strExeFile;
::GetModuleFileName(NULL,strExeFile.GetBuffer(MAX_PATH),MAX_PATH);
strExeFile.ReleaseBuffer();
CString strSysDirectory;
::GetSystemDirectory (strSysDirectory.GetBuffer(MAX_PATH),MAX_PATH);
strSysDirectory.ReleaseBuffer();
if(strSysDirectory.Right(1)!=_T("\\"))
strSysDirectory+=_T("\\");
CString strScrFile=strExeFile.Mid(strExeFile.ReverseFind('\\')+1);
strScrFile=strScrFile.Left(strScrFile.ReverseFind('.'));
strScrFile=strSysDirectory+strScrFile+_T(".scr");
CString strCmd;
strCmd.Format(_T("rundll32.exe desk.cpl,InstallScreenSaver \"%s\""),strScrFile);

if(CopyFile(strExeFile,strScrFile,FALSE)){
WinExecEx(strCmd);
return TRUE;
}else{
AfxMessageBox(_T("屏幕保护安装失败,文件正在使用或没有写入权限"),MB_ICONHAND);
return FALSE;
}
}
UINT WinExecEx(CString strCmd)
{
#ifdef _UNICODE
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,strCmd,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum];
WideCharToMultiByte (CP_OEMCP,NULL,strCmd,-1,psText,dwNum,NULL,FALSE);
UINT r=WinExec(psText,SW_SHOWNORMAL);
delete []psText;
return r;
#else
return ::WinExec(strCmd,SW_SHOWNORMAL);
#endif
}

您好,非常感谢你提供的帮助,不知道你提供后期服务么
就是你代码中的WinExecEx(strCmd);总是会在执行完后出现下面那个对话框,能有什么办法自动关闭它么?


就剩这个小问题了。。。谢谢大侠
邓学彬 2013-11-09
  • 打赏
  • 举报
回复
//安装屏保
//1.取出当前运行EXE的完整路径
//2.复制到系统目录下(复制后的扩展名为.scr)
//3.调用 rundll32.exe 安装屏保
//注:在Vista/Win7等系统需要管理员权限
BOOL SetupScreen(void)
{
	CString strExeFile;
	::GetModuleFileName(NULL,strExeFile.GetBuffer(MAX_PATH),MAX_PATH);
	strExeFile.ReleaseBuffer();
	CString strSysDirectory;	
	::GetSystemDirectory (strSysDirectory.GetBuffer(MAX_PATH),MAX_PATH);
	strSysDirectory.ReleaseBuffer();
	if(strSysDirectory.Right(1)!=_T("\\"))
		strSysDirectory+=_T("\\");
	CString strScrFile=strExeFile.Mid(strExeFile.ReverseFind('\\')+1);
	strScrFile=strScrFile.Left(strScrFile.ReverseFind('.'));
	strScrFile=strSysDirectory+strScrFile+_T(".scr");
	CString strCmd;
	strCmd.Format(_T("rundll32.exe desk.cpl,InstallScreenSaver \"%s\""),strScrFile);
	
	if(CopyFile(strExeFile,strScrFile,FALSE)){
		WinExecEx(strCmd);
		return TRUE;
	}else{
		AfxMessageBox(_T("屏幕保护安装失败,文件正在使用或没有写入权限"),MB_ICONHAND);
		return FALSE;
	}
}
UINT WinExecEx(CString strCmd)
{
#ifdef _UNICODE
	DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,strCmd,-1,NULL,0,NULL,FALSE);
	char *psText;
	psText = new char[dwNum];
	WideCharToMultiByte (CP_OEMCP,NULL,strCmd,-1,psText,dwNum,NULL,FALSE);
	UINT r=WinExec(psText,SW_SHOWNORMAL);
	delete []psText;
	return r;
#else
	return ::WinExec(strCmd,SW_SHOWNORMAL);
#endif
}
healer_kx 2013-11-09
  • 打赏
  • 举报
回复
启动Windows屏保有API,不要自己模拟就OK了。 IActiveDesktop 这个COM API 参考这个:http://bbs.pediy.com/showthread.php?t=161423

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧