【问题标题】:SystemParametersInfo returns 0SystemParametersInfo 返回 0
【发布时间】:2013-02-01 05:00:07
【问题描述】:
#include <iostream>
#include <windows.h>
using namespace std;

int main(){
    LPWSTR test = L"C:/aizen.png";
    int result = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, test, SPIF_UPDATEINIFILE);
    if(result)
        cout << "Wallpaper set!";
    else
        cout << "NOOOOO!" << result;
    cin >> result;
    return 0;
}

非常简单的代码,但是结果返回 0。我做错了什么?

【问题讨论】:

  • 您可以尝试GetLastError() 找出问题所在
  • The docs say "注意当使用SPI_SETDESKWALLPAPER标志时,SystemParametersInfo总是返回TRUE。"
  • @Carl 文档撒了一个大大的谎言!
  • 文档还讲述了,关于第三个参数:“一个参数,其用法和格式取决于被查询或设置的系统参数。有关系统范围参数的更多信息,请参阅uiAction参数。如果没有另外说明,您必须为此参数指定 NULL。有关 PVOID 数据类型的信息,请参阅 Windows 数据类型。"并且没有为 SPI_SETDESKWALLPAPER 指定任何内容。也许是丢失的标志?
  • NULL 在 Windows 下为 0。使用哪一个并不重要。

标签: c++ winapi


【解决方案1】:

按照documentation 所说的做,并致电GetLastError 找出错误背后的原因。

一些可能的原因浮现在脑海:

  • SystemParametersInfo 不喜欢正斜杠作为分隔符。
  • 系统不喜欢 .png 文件作为壁纸。
  • 文件不存在。
  • 您的 ANSI/Unicode 编码不匹配。
  • 您无权修改壁纸。

真的,这个列表是无穷无尽的。所以让系统告诉你。


请注意,文档中说:

当使用SPI_SETDESKWALLPAPER 标志时,SystemParametersInfo 总是返回TRUE

但这是一个大大的谎言。调用函数非常简单,传递SPI_SETDESKWALLPAPER,然后接收FALSE 作为回报。

【讨论】:

  • 表示文件未找到,但文件在里面!
  • / 替换为反斜杠`\`
  • 我把它换成了 '\' 和 '\\' 他们都没有工作! :( 我将目录更改为桌面(以防万一是权限问题)但仍然无法正常工作...
  • 我已经评估了所有要点,但在我自己的尝试中却一无所获。无论我调用 A 版本还是 W 版本,无论我使用 / 还是 \(Windows Imaging Component 都接受,GetFileAttributes 也是如此),该文件存在,因为我在调用 SystemParametersInfo 之前对其进行了测试,我得到错误 0。我是盒子的管理员,所以我可以更改壁纸(否则错误代码将是拒绝访问,不是吗?)。并不是这些设置排除了使用图像——顺便说一下,Win7 喜欢 PNG 作为壁纸,这也不是。
【解决方案2】:

不知道我们掌握的信息。

这个返回值表示调用失败。您需要致电GetLastError() 了解原因。

【讨论】:

  • GetLastError() 返回 2(未找到文件)但他的文件在那里!
猜你喜欢
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 2019-02-20
  • 2015-06-17
相关资源
最近更新 更多