使用 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 壁纸(操作未实现异常)的主要内容,如果未能解决你的问题,请参考以下文章