如何使用 WIN32 C/C++ API 告诉 Windows 10 平铺、居中或拉伸桌面壁纸?

     2023-04-13     47

关键词:

【中文标题】如何使用 WIN32 C/C++ API 告诉 Windows 10 平铺、居中或拉伸桌面壁纸?【英文标题】:How does one tell Windows 10 to tile, center, or stretch desktop wallpaper using WIN32 C/C++ API? 【发布时间】:2021-11-16 12:27:49 【问题描述】:

目标:使用 C++、Win32 SDK 和 Visual Studio 2019将桌面壁纸设置为居中或平铺或拉伸

可以使用 SystemParametersInfo() 来改变壁纸。完全没问题。

问题是告诉系统平铺、居中或拉伸壁纸图像。

在网上阅读,壁纸图片是居中、平铺还是拉伸取决于一对注册表项:

HKCU\Control Panel\Desktop\TileWallpaper
HKCU\Control Panel\Desktop\WallpaperStyle

MS 的 WIN32 文档告诉如何更改图像,但我找不到任何描述如何更改布局的内容。

我有以下代码。这是一个控制台应用程序项目,功能从我更大的 MFC 应用程序中提取出来,因此是函数名称。该项目的字符集设置为 Unicode,因此我使用了 W 函数。

它确实改变了壁纸图像,但无论调用哪个 onWallpaper___() 函数,壁纸总是平铺的。

Windows 似乎完全忽略了注册表更改。我已验证我的代码确实更改了注册表项的值。

问题:如何让 Windows 10 使用 WIN32 C/C++ API 平铺、居中或拉伸桌面壁纸?

问题:是否应该使用不同的注册表项?

#include <Windows.h>
#include <iostream>
#include <string>
#include <cassert>

const int CENTERED = 0;
const int TILED = 1;
const int STRETCHED = 2;


void set_wallpaper_registry_keys(int discriminant) 
    BOOL rtn;
    HKEY hKey;
    DWORD TileWallpaper = 0;
    DWORD WallpaperStyle = 0;
    switch (discriminant) 
        case CENTERED: 
            TileWallpaper = 0;
            WallpaperStyle = 1;     // some sources say use 6, makes no difference.
        
        break;
        case TILED: 
            TileWallpaper = 1;
            WallpaperStyle = 0;
        
        break;
        case STRETCHED: 
            TileWallpaper = 0;
            WallpaperStyle = 2;
        
        break;
        default: 
            assert(false);
        
        break;
    
    std::wstring key_name(L"Control Panel\\Desktop");
    rtn = RegOpenKeyEx(HKEY_CURRENT_USER, key_name.c_str(), 0, KEY_ALL_ACCESS, &hKey);
    assert(rtn == ERROR_SUCCESS);
    rtn = RegSetValueEx(hKey, L"TileWallpaper",  0, REG_DWORD, (BYTE *)&TileWallpaper,  sizeof(DWORD));
    assert(rtn == ERROR_SUCCESS);
    rtn = RegSetValueEx(hKey, L"WallpaperStyle", 0, REG_DWORD, (BYTE *)&WallpaperStyle, sizeof(DWORD));
    assert(rtn == ERROR_SUCCESS);
    rtn = RegFlushKey(hKey);
    assert(rtn == ERROR_SUCCESS);
    rtn = RegCloseKey(hKey);
    assert(rtn == ERROR_SUCCESS);



void OnWallpaperCentered() 
    BOOL rtn;
    set_wallpaper_registry_keys(CENTERED);
    // set current image as wallpaper: SPI_SETDESKWALLPAPER
    std::wstring fn = L"c:\\tmp\\stars.jpg";
    rtn = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (void *) (fn.c_str()), SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
    assert(rtn == TRUE);



void OnWallpaperTiled() 
    // TODO: Add your command handler code here
    BOOL rtn;
    set_wallpaper_registry_keys(TILED);
    std::wstring fn = L"c:\\tmp\\snail.jpg";
    rtn = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (void *) (fn.c_str()), SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
    assert(rtn == TRUE);



void OnWallpaperStretched() 
    // TODO: Add your command handler code here
    BOOL rtn;
    set_wallpaper_registry_keys(STRETCHED);
    std::wstring fn = L"c:\\tmp\\civ4.jpg";
    rtn = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (void*) (fn.c_str()), SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
    assert(rtn == TRUE);



int main() 
    //OnWallpaperTiled();     // Tiles the wallpaper
    OnWallpaperCentered();    // Tiles the wallpaper as well
    //OnWallpaperStretched(); // Tiles the wallpaper too
    std::cout << "Hello World!\n";

【问题讨论】:

看起来有COM Interface 可以做到这一点。可能有帮助或没有:-) 哇。这真的是我不知道要搜索什么的情况。在我查找 IActiveDesktop 后,我发现了大量的文档和示例。 Win95 没有这些接口,您只需先手动写入注册表 IIRC(可能还不支持拉伸?)。 【参考方案1】:

尝试IDesktopWallpaper 接口和IActiveDesktop 接口。

通过创建CLSID_DesktopWallpaperCLSID_ActiveDesktopobjects 为它们创建对象。

【讨论】:

如何将 WebKit 嵌入到我的 C/C++/Win32 应用程序中?

】如何将WebKit嵌入到我的C/C++/Win32应用程序中?【英文标题】:HowtoembedWebKitintomyC/C++/Win32application?【发布时间】:2009-12-1720:10:09【问题描述】:我找到的解决方案无关紧要:有人在Delphi项目中使用了WebKit有人将它与Java一起使用有... 查看详情

带有win32con的Python滚轮鼠标

...con【发布时间】:2021-12-2002:05:53【问题描述】:请告诉我如何解决我的小问题。我正在为android模拟器编写自动化程序,我在其中使用win32api库来模拟非活动程序窗口中的操作。有时我需要将鼠标滚动发送到模拟器。为此我使用:... 查看详情

vc,mfc,api,windows编程,win32(sdk),gui学习的顺序是怎样的,本人迷茫中!!

...VC太狭义了,包含在VisualStdio集成环境。VC的学习就是学习如何使用集成环境,以及如何调试程序而已。VS包含各种语言的个人与团队开发,测试以及数据库系统,公司大多会用VS2010或VS2008。MFC只是对WIN32API从面向对象的思路进行... 查看详情

如何在 Windows (win32) 上获取每个线程的 cpu 使用率

】如何在Windows(win32)上获取每个线程的cpu使用率【英文标题】:Howtogetthecpuusageperthreadonwindows(win32)【发布时间】:2010-11-2610:52:18【问题描述】:寻找Win32API函数、C++或Delphi示例代码,告诉我线程的CPU使用率(百分比和/或总CPU时间... 查看详情

python可以直接调用win32的api吗

...lSubjectmsg.Body = emailBodymsg.Send()上面的简单例子就是使用python来调用outlook发邮件参考技术Apython属于脚本语言,跑在VM上的,是不能直接调用win32API的。但是你可以使用C/C++包装起来API功能,提供给python调用。可以间接调用,... 查看详情

如何使用 win32 api 获取域用户帐户列表?

】如何使用win32api获取域用户帐户列表?【英文标题】:HowdoIgetalistofdomainuseraccountswithwin32api?【发布时间】:2008-10-2721:08:39【问题描述】:特别是,当计算机不是域控制器时,我无法获取此列表。相反,它是域的成员。【问题讨... 查看详情

按下回车按钮时如何使用 C++ Win32 API 调用按钮?

】按下回车按钮时如何使用C++Win32API调用按钮?【英文标题】:HowtoinvokeabuttonusingC++Win32APIwhenpresstheenterbutton?【发布时间】:2012-10-2208:54:28【问题描述】:我已经使用c++win32API创建了一个对话框...有3个文本框、1个组合框和3个按钮.... 查看详情

如何在 Ruby 中使用 Win32API 从 DLL 返回字符串

】如何在Ruby中使用Win32API从DLL返回字符串【英文标题】:HowdoIreturnastringfromaDLLusingWin32APIinRuby【发布时间】:2012-12-0215:13:05【问题描述】:目前我只能在Ruby中使用win32api,所以没有ffi等。在Ruby中,我正在加载一个DLL并传递一个字... 查看详情

如何从 PHP 进行 Win32 API 调用?

】如何从PHP进行Win32API调用?【英文标题】:HowdoImakeWin32APIcallsfromPHP?【发布时间】:2009-09-1115:34:01【问题描述】:我知道我可以使用COM组件,但是有没有办法直接从PHP调用Win32API(user32.dll、advapi32.dll等),或者我是否需要包装在... 查看详情

如何使用 Win32 API 阻止来自透明窗口的鼠标输入?

】如何使用Win32API阻止来自透明窗口的鼠标输入?【英文标题】:HowtoblockmouseinputfromtransparentwindowwithWin32API?【发布时间】:2017-05-2300:38:07【问题描述】:我正在创建的程序不拥有进程中的主窗口。我正在使用WindowsHook将DLL注入此... 查看详情

如何使用 C# 拦截 Win32 API 调用?

】如何使用C#拦截Win32API调用?【英文标题】:HowtointerceptWin32APIcallswithC#?【发布时间】:2014-05-1900:58:49【问题描述】:我想托管一个虚拟驱动器并拦截I/O,或者拦截对硬盘驱动器上某些文件夹的I/O调用,然后对该调用执行任意操... 查看详情

如何使用 SQL 文件流 win32 API 并支持 WCF 流

】如何使用SQL文件流win32API并支持WCF流【英文标题】:HowtouseSQLfilestreamingwin32APIandsupportWCFstreaming【发布时间】:2011-02-2210:37:28【问题描述】:我正在使用Sqlserver文件流类型在后端存储大文件。我正在尝试使用WCf将文件流式传输到... 查看详情

win32 API 编程

...其中的文本。首先我必须获得记事本的句柄,但我不知道如何获得记事本处理所以请告诉我。那我可以通过哪些函数得到它的内部文本?要包含哪些头文件?什么是必要的声明?请帮助我,我是WindowsAPI编程的新手。我已经阅读... 查看详情

如何使用 Win32 API 在 WinForm 前显示 System.Diagnostics

】如何使用Win32API在WinForm前显示System.Diagnostics【英文标题】:HowToShowSystem.DiagnosticsInFrontOfWinFormUsingWin32API【发布时间】:2012-10-1902:58:01【问题描述】:在我的主窗体上,我有一个ListView,其中包含属于我们软件套件的进程的LargeIco... 查看详情

如何确定特定 win32 api 调用所需的 windows 库?

】如何确定特定win32api调用所需的windows库?【英文标题】:HowcanIdeterminethewindowslibrariesrequiredforaspecificwin32apicall?【发布时间】:2012-02-1620:40:14【问题描述】:我正在使用几个Windowsapi模块,如win32wnet、win32file、win32con等,但只有其... 查看详情

将 GDI+ 与使用 GDI 的基于 C 的传统 win32 系统一起使用

】将GDI+与使用GDI的基于C的传统win32系统一起使用【英文标题】:UsingGDI+withlegacyCbasedwin32systemusingGDI【发布时间】:2017-03-1023:58:43【问题描述】:在使用win32C/C++编写的系统上工作,它使用GDI绘制复杂机器(热交换器)的横截面,... 查看详情

为啥需要告诉结构它们有多大?

】为啥需要告诉结构它们有多大?【英文标题】:Whydostructuresneedtobetoldhowbigtheyare?为什么需要告诉结构它们有多大?【发布时间】:2010-05-3101:11:22【问题描述】:我注意到在c/c++中需要告诉许多Win32API结构它们有多大。即someStruct.p... 查看详情

如何在 Win32 API 的对话框中显示自定义消息?

】如何在Win32API的对话框中显示自定义消息?【英文标题】:HowtoshowcustommessagesinadialogboxinWin32API?【发布时间】:2013-09-1710:10:59【问题描述】:如何在Win32API中使用对话框显示自定义消息,而不是在默认的MessageBox函数中显示它们?... 查看详情