在C++ Builder中实现桌布自动更新

C++Builder中注册表的操作 以一个实例来说明TRegistry类的用法。 首先,先介绍一下TRegistry的属性和方法 WinNT的用户都知道,WinNT在启动时需要按Ctrl+Alt+Del登录,即便没有密码也是如此.虽然WinNT不会象 WIN9X那样经常死机,但每次开机都要这样还是有点烦.能 不能让WinNT每次启动自动登录呢?其实只要把注册表的一 个属性AutoAdminLogon的值设置为"1"即可,可惜的是这 样做只能管一次,每次启动后WinNT就会自动把它的值改为 "0"(该死的Bill!).如果每次都要修改注册表,还不如每次手动登录呢!写个程序在启动后自动修改这个值就OK了 立即下载

 

在C++ Builder中要实现桌布的自动更换功能,我认为主要两个关键点,其一既然要“自动”那就免不了要用到定时器,我们可以用Timer这个组件来完成,这个还好解决,第二个问题可能比较麻烦了,我们如何来设置桌布,好像BCB中并没有提供什么组件,那我们也就只好自力更生了,虽说本人只是一只菜鸟,但这个问题还是难不了我,它主要是用到了SystemParametersInfo 这个Windows API函数,它的声明如下:

BOOL SystemParametersInfo(

  UINT uiAction, // system parameter to query or set

  UINT uiParam,  // depends on action to be taken
      
  PVOID pvParam, // depends on action to be taken
      
  UINT fWinIni   // user profile update flag
      
);
      
它是一个非常重量级的函数,主要用来设置或获得系统范围上的相关参数(如:我
正在介绍的“如何设置桌布”,还有如:系统字体,屏幕分辨率等),其实光从字
面上也能大概知道它的作用。如果只是简单的调用SystemParametersInfo函数的话,
问题就变得简单多了,但你要总不能只使用默认的桌布样式,所以在设置桌布之
前还应先设置好桌布的样式,比如:桌布的显示位置,是否填满桌面等,然后在
调用SystemParametersInfo函数,这个函数会根据注册表里的桌布样式设置情况来
设置实际的桌布样式。
    

    
与桌布样式有关的注册表设定:(位于HKEY_CURRENT_USER/Control Panel/Desktop键)
    

键名

含义

WallPaper

桌布的文件名,但只限于BMP格式的位图

WallPaperStyle

设置桌布样式

若为0,桌布将以原始尺寸显示在桌面中央

若为1,桌布将填满桌面

若为2,将桌布放大的画面大小,图像有可能失真

WallPaperOriginX

如果WallPaperStyle为0,则这表示图像左上角X轴坐标

WallPaperOriginY

如果WallPaperStyle为0,则这表示图像左上角Y轴坐标

 

注意:

其实,上表还漏了TileWallpaper键,这个设定值的优先级最高,即当TileWallpaper这个值为1时,不管其它参数为何值,都会将桌布填满桌面,为了简化程序,一般将其设置为0,然后在根据WallPaperStyle来设置桌布样式,这是比较明智的做法。

 

在了解了与桌布相关的注册表的设置情况后,那我们就进入具体的桌布设置吧!

 

#include

       //先在注册表里添好桌布样式,在设置桌布

  TRegistry *Registry = new TRegistry;

  try

  {

    Registry->OpenKey(“//Control Panel//Desktop”,false);

          Registry->WriteString("TileWallpaper","0");

              //设置桌布样式

Registry->WriteString("WallpaperStyle",wallStyle);

  }

  __finally

  {

    delete Registry;

  }

}

       //设置桌布

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0,FileName.c_str(),SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);

 

在此,我们已经解决了最为关键的问题,剩下的关于设置定时器那就简单了,只需用一个定时器组件即可完成.

代码如下:

 

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

    if (ListBox1->Items->Count<=0)

    {

        return ;

    }

 

    if (index>=ListBox1->Items->Count)

    {

        index=0;

    }

        //如果是JPG格式就将其转换为BMP格式,将其存到临时文件夹中

  if(UpperCase(ListBox1->Items->Strings[index]).Pos(".JPG")||UpperCase(ListBox1->Items->Strings[index]).Pos(".JPEG"))

    {

        AnsiString fileName=ExtractFileName(ListBox1->Items->Strings[index]);

        int len=fileName.LastDelimiter(".");

        fileName=fileName.SubString(0,len-1)+".bmp";

        unsigned int *size=new unsigned int(256);

        char * buffer=new char[256];

        GetTempPath(*size,buffer);

        fileName=AnsiString(buffer)+fileName;

        JPEGToBMP(ListBox1->Items->Strings[index],fileName);

            //设置桌布

      SystemParametersInfo(SPI_SETDESKWALLPAPER,0,ListBox1->Items->Strings[index].c_str(),SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);

    }

    else

    {

            //设置桌布

        SystemParametersInfo(SPI_SETDESKWALLPAPER,0,ListBox1->Items->Strings[index].c_str(),SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);

    }

        //重建系统缓存

    RebuildIconCache();

    index++;

}

就这样,我们就完成了桌布自动更换的功能,是不是很简单,不过由于它受限于BMP位图格式,这一点总是使得桌布的爱好者十分苦恼.我们能不能让它支持其它格式的图形文件呢?当然可以,原理是这样的,在设置桌布之前,现将其它格式的文件转换为位图,在用SystemParametersInfo函数设置桌布即可搞定.

 

JPEG格式转换为位图:

#include

bool __fastcall TForm1::JPEGToBMP(AnsiString jpegFile,AnsiString bmpFile)

{

    //TODO: Add your source code here

    TJPEGImage *jpeg = new TJPEGImage();

    jpeg->LoadFromFile(jpegFile);

    Graphics::TBitmap *bitmap = new Graphics::TBitmap();

    try {

        bitmap->Assign(jpeg);

        bitmap->SaveToFile(bmpFile);

    }

    __finally {

        delete jpeg;

        delete bitmap;

    }

    return true;

}

遗憾的是BCB不直接支持如PNG,GIF等格式与位图的转换,希望在BCB6.0以后的版本中会得到支持.如果要进行PNG,GIF格式的转换,我们可以去寻求控件,这是最简单的办法,还有一种就是自己编写图形格式转换的程序,这个比较困难.首先要知道各种图形格式的标准,然后编写格式转换的算法,这是最重要的,最后进行编码.还有一点我也想说一下,如果你足够细心的话,可能已经发现了我在实现Timer1Timer(TObject *Sender)这个函数的时候用到了一个RebuildIconCache()函数,注释说是重建系统缓存,其实是这样的当你改变了桌布的时候,可能系统来不及重新绘制桌布,这时你需要手动地按下F5来进行刷新,但我们的程序总不能去叫用户刷新吧,所以我增加了一个RebuildIconCache()函数来完成此功能,它是这样实现的。

void __fastcall TForm1::RebuildIconCache()

{

    //TODO: Add your source code here

    int IconW;

    IconW= GetSystemMetrics(SM_CXICON);

    TRegIniFile *Reg = new TRegIniFile("Control Panel//Desktop");

    try

    {

        Reg->WriteString("WindowMetrics", "Shell Icon Size", IntToStr(IconW));

        SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);

    }

    __finally

    {

        delete Reg;

    }

}

这样只要你改变了桌布设置,再广播WM_SETTINGCHANGE窗口消息,系统就会进行桌布的重新绘制。

 

提示:如果你想自己体会一下这个程序的功能,你不必通过键盘的输入来达到目的,http://www.zccfamily.com/zqget/ 提供了这个程序的所有源代码,你可以去下载来看一下实际的效果。

 

在阅读本文的过程中,无论是心存感激(我帮你解决了问题)还是心有疑惑(这是不是你的原创,还是在其它地方去抄的),或者对本文有什么评价的话,我的联系方式:

 

mailto:zqget@msn.com

C++Builder 修改系统对话框英文标题 立即下载

相关推荐

激光及激光器超全细节&原理总结

本文详细展示了激光、激光器、PN结、半导体激光器、光纤激光器的原理和应用;

guangwulv的博客 5362

C++BUILDER 获取文件版本号的源代码

最近做一个自动升级程序,发现需要取DLL或EXE的版本号,通过版本号比较才知道需不需要升级,看了一些网上的材料,有的太复杂,有的明显对SDK API理解不够,写个函数出来供大家参考: bool __fastcall GetFileVer(String FileName, String &Ver){    unsigned int iZero = 0, iLen = 0;

boyla的专栏 3364

日前日内多阶段多时间尺度源荷储协调调度(matlab代码)

多阶段多时间尺度的协调调度的优势是考虑新能源出力的波 动性与随机性,需求响应负荷的不确定性会对电网制定的日前调度计划准确性造成影响,也就是能够更加精准的进行调度和分析,优化结果的可用性更强。在这方面论文里面,金力的《考虑特性分布的储能电站接入的电网多时间尺度源储荷协调调度策略》就考虑了日前日内实时三个阶段调度,每个阶段考虑了不同负荷需求响应策略,同时考虑了负荷波动性的影响,具有很强的参考意义。 目录 一、模型 二、程序运行 三、程序链接 一、模型 负荷需求响应考虑电价型和激励型两种,电.

zhangxd212489的博客 7915

C++Builder中注册表的操作 (转载)

作者: jingtian 发表日期: 2006-01-19 12:40 文章属性: 原创 复制链接 首先,先介绍一下TRegistry的属性和方法: TRegistry类一共有四个属性。

BeiAn的专栏 1116

密码学小白必看:三大顶级会议论文下载与阅读指南(附完整资源链接)

本文为密码学初学者提供了系统获取和阅读三大顶级会议(Crypto、Eurocrypt、Asiacrypt)论文的实战指南。详细介绍了通过IACR官方渠道、ePrint预印本等权威资源免费下载论文的方法,并分享了高效筛选、精读核心章节及构建个人知识体系的具体策略,帮助读者快速切入密码学研究前沿。

weixin_28363123的博客 411

多机器人协同:水下机器人集群的分布式控制与ROS仿真实践

本文探讨了多自主水下机器人(AUV)集群的分布式控制方法,重点分析了欠驱动6自由度AUV模型的反馈线性化技术。通过ROS/Gazebo仿真平台,详细介绍了系统架构设计、通信延迟补偿策略及环境扰动应对方案,为水下协同作业提供实用参考。

jupi8的博客 688

C++Builder注册表编程实例详解

 一、注册表编程详解  Windows  注册表中包含了系统配置、机器硬件配置、 Win32 应用程序和用户的其他配置信息。许多高级一些的功能都要通过对注册表的操作来实现。在 WinAPI 中提供了 RegCgreateKey() 、 RegOpenKey() 、 RegQueryValue() 等函数操作注册表,但是用这些函数来操作注册表使用起来非常麻烦。而利用 C ++ Builder

jiangxinyu的专栏 2719

搬运机器人系列编程:KUKA KR QUANTEC_(2).KUKA KRL语言编程基础

定义一个函数END!调用函数PRINT "结果: ", result!定义一个过程PRINT msgEND!调用过程printMessage("欢迎使用 KUKA 机器人")!定义搬运零件的起始位置和目标位置!定义焊接路径的各个点!定义喷涂路径的各个点KUKA Robot Language (KRL) 是一种专门为工业机器人设计的编程语言,具有结构化编程、丰富的库函数、实时性以及集成性等特点。

zhubeibei168的博客 1248

C++更改桌面背景

C++ 更改windows桌面背景

xy_77777的博客 772

【Python LeetCode 专题】面试经典 150 题

面试经典 150 题

一杯水果茶!足矣~ 1173

1、硬件工程师笔面试真题汇总(2025版本)

答:按照使用习惯,电源指示灯用红色,信号指示灯用绿色这两种颜色的LED 灯技术最成熟,价格最便宜通孔是贯穿整个PCB 的过孔盲孔是从PCB 表层连接到内层的过孔埋孔是埋在PCB 内层的过孔。大多数PCB厂家的加工能力是这样的:大于等于8mil 的过孔可以做机械孔小于等于6mil 的过孔需要做激光孔对小于等于6mil 的微型孔,在钻孔空间不够时,允许一部分过打在PCB 焊盘上。

XU157303764的博客 2万+

C++Builder 资料库

转自:  1.怎样在C++Builder中创建使用DLL  2.用C++Bulider在WIN.INI中保存信息  3.如何在C++Builder中检测硬件  4.C++Builder如何响应消息及自定义消息  5.利用C++ Builder开发动画DLL  6.用C++ Builder 3制作屏幕保护程序  7.TCP/IP头格式  8.UDP  9.判断windows的D

hemeinvyiqiluoben的专栏 5561

环境配置与基础教程:2026大厂标准:使用 DVC (Data Version Control) 实现 YOLO 数据集版本控制全链路管理

本文介绍了使用DVC 3.0对YOLO数据集进行全链路版本控制的方法。主要内容包括: DVC 3.0的核心增强:内容块级缓存去重、并行云传输、AI智能体元数据跟踪等新特性,可显著提升YOLO数据集管理效率。 环境配置:详细说明DVC 3.0的安装步骤、项目初始化方法以及远程存储配置方案(支持S3、GCS、Azure等多种存储后端)。 目录结构规范:提供符合大厂MLOps标准的项目目录结构设计。 实战操作: 原始数据版本化 多格式标注数据版本控制 版本切换方法 优势说明:DVC通过哈希指针机制管理大型数据集,

ZXSXJ的博客 148

C++Builder常用代码片断 (转)

C++Builder常用代码片断 (转)[@more@]microsoft FrontPage 4.0"> A:hover {color: #FF0000; font-style: italic; font-wei...

circularr9834的博客 417

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

在指定容器(TPanel)上动态创建Tpanel控件组

在指定可视化容器上,动态创建Tpanel的例子

moneytree的专栏 389

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++ Builder 经验小技巧

读写注册表现在的Windows程序大都使用了注册表来存储软件的配置信息。C++Builder 3.0中给我们提供了一个TRegistry类帮助我们管理注册表,它有以下几个常用的方法:OpenKey 打开一个键值ReadBool 从注册表中读取布尔值ReadInteger 从注册表中读取整型值ReadString  从注册表中读取字符串值WriteBool  向注册表

白水绕东城 1866

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

windows的鼠标、键盘消息(阅windows核心编程笔记)

一、基本概念:当系统初始化时,要建立一个特殊的线程,即原始输入线程(raw input thread,RIT)。此外,系统还要建立一个队列,称为系统硬件输入队列(System hardware input queue, SHIQ)。RIT和SHIQ构成系统硬件输入模型的核心。对鼠标消息,RIT只是确定是哪一个窗口在鼠标光标之下。RIT调用GetWindowThreadPro cessId来确定是哪

zhangyq73的专栏 4326

C语言实现设置桌面壁纸

C语言实现设置桌面壁纸

qq_56402474的博客 2129

SystemParametersInfo详说

函数功能描述:查询或设置系统级参数。该函数也可以在设置参数中更新用户配置文件。函数原型B00L SystemParametersinfo(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinlni);参数uiAction:该参数指定要查询或设置的系统级参数。其取值如下;SPI_GETACCESSTIMEOUT:检索与可访问特性相关联的超时段的信息,P

showlong 专栏「C++」@ http://www.fuel4d.com 9220

C++builder中实现无标题栏窗口的移动

这个似乎是老生常谈的问题,网上的资料也有很多,不过还总是有人在问我,今天就它放在这里,以供参考。在Form的MouseDown事件里写下下面的两行代码即可:ReleaseCapture();SendMessage(Form1->Handle,WM_NCLBUTTONDOWN,HTCAPTION,0);呵呵,是不是太简单了啊?希望对您有所帮助。

sas_razor的专栏 1851

C++bulder修改窗口风格

将窗口改为浮动工具栏风格: .h文件 private: // User declarations void __fastcall CreateParams(TCreateParams & Param); .cpp文件 void __fastcall TSoftboard::CreateParams(TCreateParams & Param) { TForm::Cre

chinayu2007的专栏 816

VC将窗口置最前

windows下简单的调用Setforegroundwindow并不能将窗口置最前,我找到三种方法可以实现该功能。1、先置topmost,然后取消 SetWindowPos(HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); SetWindowPos(HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOM

Jinhill's Blog 6012

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 254

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 349
上一篇: 话说小工具GREP
下一篇: 控制面板知多少(续篇)
ZQGet
博客等级 码龄23年 4粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值