C制作屏幕背景替换

本文介绍使用C语言实现桌面背景自动轮换的方法。通过FindFirstFile和FindNextFile遍历指定文件夹中的图片文件,并利用SystemParametersInfo函数将图片设为桌面背景,实现了每隔一段时间更换一张图片的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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:转换背景图片瞬时完成,没有幻灯片的效果,看着很难受

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值