【问题标题】:Change Windows 7 Wallpaper with Win32/C++ API (Operation not implemented exception)使用 Win32/C++ API 更改 Windows 7 壁纸(操作未实现异常)
【发布时间】: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

标签: c++ windows winapi windows-7


【解决方案1】:

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

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

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

【讨论】:

  • 我将图像重新导出为 JPG(它是一个 PNG 文件),起初我忽略了它,因为它在 Windows 8.1 中工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-12-11
  • 2014-05-28
  • 2011-07-10
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2022-11-02
  • 2012-07-05
相关资源
最近更新 更多