如何获得桌面壁纸所在路径? rt 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TCHAR path[_MAX_PATH];::SystemParametersInfo(SPI_GETDESKWALLPAPER, _MAX_PATH, path, 0); 用SystemParametersInfo(SPI_GETDESKWALLPAPER, _MAX_PATH, path, 0)时,VC报错:undeclared identifier 对!“SPI_GETDESKWALLPAPER undeclared identifier” hehe.SPI_GETDESKWALLPAPER是2000/xp才支持的。vc6出来的时候,大概还没有2000呢,因此,如果是原版的vc 6,没有升级过sdk,肯定会出现这个变量没有定义。这个值具体是多少,我也不知道,不过,.net的系统中,应该有这个变量的定义,msdn中就有,不过,msdn没有列出它等于几来。 #include "ShlObj.h"#include "afxconv.h"void CTestDlg::OnOk() { TCHAR path[_MAX_PATH]; /* // 使用SystemParametersInfo ::SystemParametersInfo(SPI_GETDESKWALLPAPER, _MAX_PATH, path, 0); */ // 使用注册表 LPCTSTR regpath = _T("Control Panel\\Desktop"); LPCTSTR valuename = _T("ConvertedWallpaper"); HKEY hkey = NULL; if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, regpath, 0, KEY_READ, &hkey)) { DWORD size = _MAX_PATH; if (ERROR_SUCCESS == ::RegQueryValueEx(hkey, valuename, NULL, NULL, (LPBYTE)path, &size)) { MessageBox(path, _T("Wall Paper"), MB_OK | MB_ICONINFORMATION); } ::RegCloseKey(hkey); } // use IActiveDesktop if (FAILED(::CoInitialize(NULL))) { // com initialize error, quit return; } IActiveDesktop* p = NULL; if (SUCCEEDED(::CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_ALL, IID_IActiveDesktop, (void**)&p))) { wchar_t wpath[_MAX_PATH]; if (SUCCEEDED(p->GetWallpaper(wpath, _MAX_PATH, 0))) { USES_CONVERSION; ::lstrcpy(path, W2T(wpath)); MessageBox(path, _T("Wall Paper"), MB_OK | MB_ICONINFORMATION); } p->Release(); } ::CoUninitialize();}注意,使用IActiveDeskop来获得的时候,stdafx.h特别麻烦,以下是我目前的stdafx.h:#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers#define _WIN32_IE 0x0500#include <afxwin.h> // MFC core and standard components#include <afxext.h> // MFC extensions#include <wininet.h>#include <afxdisp.h> // MFC Automation classes#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls#ifndef _AFX_NO_AFXCMN_SUPPORT#include <afxcmn.h> // MFC support for Windows Common Controls#endif // _AFX_NO_AFXCMN_SUPPORT使用IActiveDesktop出来的结果,好像不是很对。 CEditView::OnLButtonDblClk 如何得到双击的行和列 常用的数据存储格式 网络编程问题? 求教!CreateCompatibleBitmap的失败问题。 Winsock编程出错,大家来帮帮忙 繁体字库问题 问一个关于GDIPlus效率过低的问题。 CFile的read怎么出错!? 遇到VC一个奇怪的问题——DLL导致程序进不了入口 儿子为什么不听父亲的话? 请教一个CArray类用法的问题 想删除指定的视图,却删不掉,怎么办?急
::SystemParametersInfo(SPI_GETDESKWALLPAPER, _MAX_PATH, path, 0);
SPI_GETDESKWALLPAPER是2000/xp才支持的。vc6出来的时候,大概还没有2000呢,因此,如果是原版的vc 6,没有升级过sdk,肯定会出现这个变量没有定义。
这个值具体是多少,我也不知道,不过,.net的系统中,应该有这个变量的定义,msdn中就有,不过,msdn没有列出它等于几来。
#include "afxconv.h"
void CTestDlg::OnOk()
{
TCHAR path[_MAX_PATH];
/*
// 使用SystemParametersInfo
::SystemParametersInfo(SPI_GETDESKWALLPAPER, _MAX_PATH, path, 0);
*/
// 使用注册表
LPCTSTR regpath = _T("Control Panel\\Desktop");
LPCTSTR valuename = _T("ConvertedWallpaper");
HKEY hkey = NULL;
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, regpath, 0, KEY_READ, &hkey))
{
DWORD size = _MAX_PATH;
if (ERROR_SUCCESS == ::RegQueryValueEx(hkey, valuename, NULL, NULL, (LPBYTE)path, &size))
{
MessageBox(path, _T("Wall Paper"), MB_OK | MB_ICONINFORMATION);
}
::RegCloseKey(hkey);
}
// use IActiveDesktop
if (FAILED(::CoInitialize(NULL)))
{
// com initialize error, quit
return;
}
IActiveDesktop* p = NULL;
if (SUCCEEDED(::CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_ALL, IID_IActiveDesktop, (void**)&p)))
{
wchar_t wpath[_MAX_PATH];
if (SUCCEEDED(p->GetWallpaper(wpath, _MAX_PATH, 0)))
{
USES_CONVERSION;
::lstrcpy(path, W2T(wpath));
MessageBox(path, _T("Wall Paper"), MB_OK | MB_ICONINFORMATION);
}
p->Release();
}
::CoUninitialize();
}
注意,使用IActiveDeskop来获得的时候,stdafx.h特别麻烦,以下是我目前的stdafx.h:
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers#define _WIN32_IE 0x0500#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <wininet.h>
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
使用IActiveDesktop出来的结果,好像不是很对。