目標:使用 C 、Win32 SDK 和 Visual Studio 2019將桌面壁紙設定為居中、平鋪或拉伸。
可以使用 SystemParametersInfo() 來更改壁紙。完全沒有問題。
問題是告訴系統平鋪、居中或拉伸壁紙影像。
在網路上閱讀,壁紙影像是居中、平鋪還是拉伸取決于一對注冊表項:
HKCU\Control Panel\Desktop\TileWallpaper
HKCU\Control Panel\Desktop\WallpaperStyle
MS 的 WIN32 檔案講述了如何更改影像,但我找不到任何描述如何更改布局的內容。
我有以下代碼。這是一個控制臺應用程式專案,功能從我較大的 MFC 應用程式中剝離出來,因此是功能名稱。該專案的字符集設定為Unicode,因此我使用了W 函式。
它確實改變了壁紙影像,但無論呼叫哪個 onWallpaper___() 函式,壁紙總是平鋪的。
Windows 似乎完全忽略了注冊表更改。我已經驗證我的代碼確實更改了注冊表項的值。
問題:如何使用 WIN32 C/C API 告訴 Windows 10 平鋪、居中或拉伸桌面壁紙?
問題:是否應該使用不同的注冊表項?
#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";
}
uj5u.com熱心網友回復:
嘗試IDesktopWallpaper界面和IActiveDesktop界面。
通過創建CLSID_DesktopWallpaper和CLSID_ActiveDesktop物件為他們創建物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/314753.html
上一篇:如何在代碼中映射域上的網路驅動器
下一篇:用鉤子阻止滑鼠訊息
