通知Windows资源管理器已更改壁纸

时间:2016-12-17 18:10:06

标签: c winapi explorer

我写了一个应用程序,通过注册表更改Windows壁纸,但我需要通知Explorer.exe,以便我可以看到新的背景。我尝试使用SendMessageTimeoutW

SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE,
                                        0, 0, SMTO_ABORTIFHUNG, 5000, NULL);

然而,它没有用。我可以使用的任何功能吗?

2 个答案:

答案 0 :(得分:2)

不要直接为这种设置修改Windows注册表;修改壁纸的正确方法是调用SystemParametersInfo API,传递SPI_SETDESKWALLPAPER,将路径传递到pvParam中的壁纸和SPIF_UPDATEINIFILE | SPIF_SENDCHANGE中的fWinIni(这使得修改成为永久性的。)

答案 1 :(得分:1)

正如Matteo建议的那样,我使用SystemParametersInfo函数设置壁纸,如下所示:

BOOL setDesk = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, L"C:\\MyWall.jpg", SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);

但它只适用于本地环境,而不适用于域环境。我不得不通过修改注册表来设置壁纸,然后使用相同的功能只通知Windows有关更改:

BOOL setDesk = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);