【问题标题】:SystemParametersInfo sets wallpaper completly black (using SPI_SETDESKWALLPAPER)SystemParametersInfo 将壁纸设置为完全黑色(使用 SPI_SETDESKWALLPAPER)
【发布时间】:2016-04-15 02:54:21
【问题描述】:

我尝试更改我的桌面墙纸。当我这样使用它时它工作得很好:

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\\1.jpg", SPIF_SENDCHANGE);

但是当我这样使用时,桌面壁纸设置为完全黑色:

std::string s = "C:\\1.jpg";
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &s, SPIF_SENDCHANGE);

我尝试使用 GetLastError() 获取更多信息,但返回值仅为 0。我还尝试使用 .png-files,但这并没有改变任何内容。

任何想法我做错了什么?

【问题讨论】:

    标签: c++ winapi desktop-wallpaper


    【解决方案1】:

    试试这个:

    SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (void*)s.c_str(), SPIF_SENDCHANGE);
    

    SystemParametersInfo 函数不接受 std::string 指针作为路径,它接受一个以 null 结尾的字符数组。这就是std::stringc_str() 方法所提供的。

    【讨论】:

    • windows api只兼容C语言类型系统和接口?
    • 几乎是解决方案。我尝试使用 c_str(),但它说它不能从“const char *”转换为“PVOID”但是如果你像这样使用它,它工作正常:(void*)s.c_str()。谢谢 :)
    • @AngelusMortis 结论错误;而是 Windows API 只兼容 C 字符串,不兼容 C++ <string> 对象
    • @andlabs:Angelus 的结论没有错。 Win32 API 是为 C 设计的。任何与 C 兼容的语言都可以使用它。它为 C++ 提供了很少的便利。
    • @CodyGray:不,你确实需要演员表,需要删除 const 修饰符。但是,您可以转换为 char* 而不是 void*
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多