用C语言改变桌面背景
1、思路
将文件夹中的图片按照一定时间间隔贴到桌面作为背景。那么会用到函数FindFirstFile和FindNextFile遍历文件夹下的图片,用SystemParametersInfo将图片作为背景贴到桌面上。
2、函数分析
HANDLE WINAPI FindFirstFile(
_In_ LPCTSTR lpFileName,//文件或者文件夹名
_Out_ LPWIN32_FIND_DATA lpFindFileData//输出信息
);
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //文件属性
FILETIME ftCreationTime; //创建时间
FILETIME ftLastAccessTime; //最近访问时间
FILETIME ftLastWriteTime; //最近修改时间
DWORD nFileSizeHigh; //高位大小
DWORD nFileSizeLow; //低位大小
DWORD dwReserved0; //保留
DWORD dwReserved1; //保留
TCHAR cFileName[MAX_PATH];//文件名,非全路径
TCHAR cAlternateFileName[14];
}WIN32_FIND_DATA,*PWIN32_FIND_DATA,*LPWIN32_FIND_DATA;
将文件夹路径传入FindFirstFile第一个参数中。注意要搜索文件夹下的文件时要路径中加入”*.“*
例如:
c:\Windows\*.*//在c:\Windows目录中查找所有文件
c:\Windows\System32\*.dll//在c:\Windows\System32目录中查找所有dll文件
c:\Windows\System.ini;在c:\Windows目录中查找System.ini文件
c:\Windows\a???.*//在c:\Windows目录中查找所有以a开头的文件名长度.为4个字符的文件
Test.dat//在当前目录查找Test.dat文件
*.*//在当前目录查找所有文件
//查找下一个文件
BOOL WINAPI FindNextFile(
__in HANDLE hFindFile,
__out LPWIN32_FIND_DATA lpFindFileData
);
查找失败返回0
BOOL WINAPI SystemParametersInfo(
_In_ UINT uiAction,
_In_ UINT uiParam,
_Inout_ PVOID pvParam,
_In_ UINT fWinIni
);
//SPI_SETDESKWALLPAPER:设置桌面壁纸。
//pvParam参数必须指向一个包含位图文件名,并且以NULL(空)结束的字符串。
3、代码
#include <windows.h>
#include <string.h>
#include <wchar.h>
#include <stdio.h>
#include <time.h>
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
){
srand(time(NULL));
TCHAR pPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH, pPath);
//GetModuleFileName(NULL, pPath, MAX_PATH);
wcscpy_s(pPath + wcslen(pPath), MAX_PATH - wcslen(pPath), L"\\photo\\*.*");
//MessageBox(NULL, pPath, L"caution", 0);
TCHAR path[MAX_PATH];
WIN32_FIND_DATA FileData;
HANDLE hSearch = NULL;
hSearch = FindFirstFile(pPath, &FileData);
if (hSearch == INVALID_HANDLE_VALUE)
return 1; // No file found
while (1){
if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){//如果是目录
wcsncpy_s(path, pPath, wcslen(pPath) - wcslen(L"*.*"));
wcscat_s(path, FileData.cFileName);
//wcscpy_s(path, FileData.cFileName);
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE);
Sleep(5000+rand()%2000);
}
if (FALSE == FindNextFile(hSearch, &FileData))
{
hSearch = FindFirstFile(pPath, &FileData);
if (hSearch == INVALID_HANDLE_VALUE){
MessageBox(NULL, L"don't have photo more", L"caution", 0);
break;
}
}
}
FindClose(hSearch);
return 0;
}
4、问题:
1:文件夹里的文件只能是文件,函数不能判断文件夹内的文件是否为图片
2:转换背景图片瞬时完成,没有幻灯片的效果,看着很难受