使用 Win32/C++ API 更改 Windows 7 壁纸(操作未实现异常)

Posted

技术标签:

【中文标题】使用 Win32/C++ API 更改 Windows 7 壁纸(操作未实现异常)【英文标题】:Change Windows 7 Wallpaper with Win32/C++ API (Operation not implemented exception) 【发布时间】:2014-02-03 09:37:15 【问题描述】:

以下代码适用于 Windows 8.1(已测试),但不适用于 Windows 7。

std::wstring loc = L"C:\\Users\User\\Desktop\\wallpaper.jpg";
BOOL ret = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (PVOID)loc.c_str(), SPIF_UPDATEINIFILE);

当我在 Windows 7 上运行程序时,出现以下异常:

First-chance exception at 0x76E3C41F (KernelBase.dll) in MyApp.exe: 0xC0000002:  The requested operation is not implemented.

以前有人遇到过这种情况吗? 我查看了http://msdn.microsoft.com/en-us/library/windows/desktop/ms724947(v=vs.85).aspx 并在 Google 上搜索,但没有成功。

【问题讨论】:

第一次机会异常并不总是一个问题,只要有东西处理它。如果继续执行会怎样? @JonathanPotter 它确实继续执行,壁纸没有改变,编辑:我在 VS 中启用了第一次机会异常并 ret = "-858993460" 0xCCCCCCCC 看起来像一个“未初始化”模式 除非您同时指定SPIF_SENDWININICHANGE,否则壁纸可能不会改变。 @DavidHeffernan SystemParametersInfoW 【参考方案1】:

您的代码唯一可能有问题的是您没有针对 Unicode 进行编译。所以SystemParametersInfo 扩展为SystemParametersInfoA 但你传递了一个宽字符串。否则,您的代码是正确的并且确实有效。

这个特定 API 调用的调试问题非常棘手。它不会给你太多有用的反馈。明显的故障模式是该特定 JPEG 文件存在问题。尽管有扩展名,但它实际上可能不是 JPEG 文件。或者它可能使用了 shell 不支持的 JPEG 功能。或者你可能弄错了文件名。这些就是解释失败的原因。

我将通过创建一个不同的 JPEG 文件来开始调试它以进行测试。如果这导致成功,那么您就知道问题出在您使用的 JPEG 文件上。

【讨论】:

我将图像重新导出为 JPG(它是一个 PNG 文件),起初我忽略了它,因为它在 Windows 8.1 中工作。谢谢!

以上是关于使用 Win32/C++ API 更改 Windows 7 壁纸(操作未实现异常)的主要内容,如果未能解决你的问题,请参考以下文章

更改整个控制台背景颜色 (Win32 C++)

win32 C++上的按钮样式

win api 音频可视化

更改win7脱机文件夹位置

win10提示防火墙没有法更改某些设置的处理办法

在 C++ Win32 客户端/框架区域中进行图形和绘图