winrt-rs
项目中捕获屏幕,因此请遵循 这些说明。
但是,我不知道如何获得
IDirect3DDevice
的第一个参数Direct3D11CaptureFramePool.Create()
。
对于C++/WinRT,
Windows.graphics.directx.direct3d11.interop.h
中有一个获取接口的函数,但是在Rust中我该怎么做?
从截图-rs 示例中,定义了三个函数来创建 d3d 设备。
fn create_d3d_device_with_type(
driver_type: D3D_DRIVER_TYPE,
flags: D3D11_CREATE_DEVICE_FLAG,
device: *mut Option<ID3D11Device>,
) -> Result<()> {
unsafe {
D3D11CreateDevice(
None,
driver_type,
None,
flags,
None,
D3D11_SDK_VERSION,
Some(device),
None,
None,
)
}
}
这个主要示例是一个允许创建不同设备类型、修改指向结构的可变指针的函数。
pub fn create_d3d_device() -> Result<ID3D11Device> {
let mut device = None;
let mut result = create_d3d_device_with_type(
D3D_DRIVER_TYPE_HARDWARE,
D3D11_CREATE_DEVICE_BGRA_SUPPORT,
&mut device,
);
if let Err(error) = &result {
if error.code() == DXGI_ERROR_UNSUPPORTED {
result = create_d3d_device_with_type(
D3D_DRIVER_TYPE_WARP,
D3D11_CREATE_DEVICE_BGRA_SUPPORT,
&mut device,
);
}
}
result?;
Ok(device.unwrap())
}
第二个示例展示了如何创建默认设备,并返回新值作为函数结果。
pub fn create_direct3d_device(d3d_device: &ID3D11Device) -> Result<IDirect3DDevice> {
let dxgi_device: IDXGIDevice = d3d_device.cast()?;
let inspectable = unsafe { CreateDirect3D11DeviceFromDXGIDevice(&dxgi_device)? };
inspectable.cast()
}
这展示了当您已经拥有 dxgi 设备时如何获取设备。
所有代码示例均取自 2024 年 4 月 8 日上午 8:24 的 snapshot-rs 存储库的主分支。