不知道如何使用IDesktopWallpaper



在文档中,有一个结构"IDesktopWallpaper",其方法名为"GetWallpaper"。该方法引用了"self",但没有"IDesktopWallpaper"的构造函数方法。

use windows::{
core::*,
Win32::UI::Shell::IDesktopWallpaper,
};
fn main() -> Result<()> {
unsafe {
//                              ?????
IDesktopWallpaper::GetWallpaper(&self, monitorid);
}
Ok(())
}

为了得到我想要的结果,我应该做什么?

COM通常使用工厂方法来构造COM对象。";标准";经典COM的工厂方法是CCD_ 1。它需要一个标识特定实现的类ID(如果有多个(和一个命名请求接口的接口ID。

windows crate公开的类ID与windows SDK不同:后者经常使用CLSID_-前缀,而前者没有。windows机箱中的DesktopWallpaper与windows SDK中的CLSID_DesktopWallpaper是相同的GUID。

另一个区别是,windows机箱中的CoCreateInstance在其返回的接口类型上是通用的(而不是在windows SDK中采用类型擦除的void*的地址(。客户端将需要显式地命名他们请求的接口类型。

以下代码初始化COM(必需(,实例化COM对象,并返回一个IDesktopWallpaper接口以供进一步使用:

use windows::{
core::Result,
Win32::{
System::Com::{CoCreateInstance, CoInitialize, CLSCTX_ALL},
UI::Shell::{DesktopWallpaper, IDesktopWallpaper},
},
};
fn main() -> Result<()> {
// Initialize COM
unsafe { CoInitialize(None) }?;
// Create a DesktkopWallpaper object and return its IDesktopWallpaper interface
let wallpaper: IDesktopWallpaper =
unsafe { CoCreateInstance(&DesktopWallpaper, None, CLSCTX_ALL) }?;
// Use the COM object
unsafe { wallpaper.GetWallpaper(...) };
Ok(())
}

您需要在Cargo.toml文件中包含以下内容:

[dependencies.windows]
version = "0.42.0"
features = [
"Win32_UI_Shell",
"Win32_System_Com",
]

相关内容

  • 没有找到相关文章

最新更新