如何在windows rs中获取IAudioSessionControl2



我正试图在Rust中编写一个类似mute.fm的程序,这是我第一个同时使用Rust和winapi的大项目。我设法得到了IAudioSessionControl,但它不包括进程ID或名称,所以无法知道它是哪个应用程序。IAudioSessionControl2GetProcessID方法,但我找不到任何方法来获得这个接口。

看起来在C#中,只需执行IAudioSessionControl2 ctl2 = ctl as IAudioSessionControl2;就可以获得它,其中ctlIAudioSessionControl(在本期中找到了这个片段(,但在Rust中,这并没有那么简单。使用From可以将IAudioSessionControl2转换为IAudioSessionControl,但不能使用

如果有帮助的话,这是我使用的代码:

use std::ptr;
use windows::Win32::{Media::Audio::*, System::Com::*};
fn main() {
unsafe {
CoInitialize(ptr::null()).unwrap();
let enumerator: IMMDeviceEnumerator =
CoCreateInstance(&MMDeviceEnumerator, None, CLSCTX_ALL).unwrap();
let device = enumerator
.GetDefaultAudioEndpoint(eRender, eMultimedia)
.unwrap();
let manager: IAudioSessionManager2 = device.Activate(CLSCTX_ALL, ptr::null()).unwrap();
let sessions = manager.GetSessionEnumerator().unwrap();
for n in 0..sessions.GetCount().unwrap() {
let session_control = sessions.GetSession(n).unwrap();
}
CoUninitialize();
}
}

原来您需要像这样在IAudioSessionControl上使用.cast(),显式注释类型

let session_control_2: IAudioSessionControl2 = session_control.cast().unwrap();

文档并不像我希望的那样清晰。由于有评论,我决定在IAudioSessionControl页面上搜索QueryInterface,并找到了.cast()方法

最新更新