如何在UWP/windows-rs中创建主窗口以解决捕获API报错
解决UWP中Rust调用GraphicsCapturePicker的主窗口创建问题
错误原因
你遇到的0x8000000E错误,本质是UWP的UI组件(如GraphicsCapturePicker)必须依附于一个已创建并激活的主窗口上下文,而你的代码没有启动UWP应用框架的核心窗口机制,导致Picker无法获取有效视图。
解决方案
UWP应用必须通过CoreApplication::Run启动应用框架,创建主视图并绑定窗口激活逻辑,所有UI操作需在CoreDispatcher线程中执行。以下是修正后的完整代码:
use windows::{ core::Result, ApplicationModel::Core::{CoreApplication, CoreApplicationView, ApplicationInitializationCallback, CoreApplicationViewActivatedEventHandler}, Graphics::Capture::GraphicsCapturePicker, UI::Core::{CoreWindow, CoreDispatcherPriority, DispatchedHandler}, }; // 主视图激活后的处理逻辑 fn on_view_activated(_view: &CoreApplicationView, _args: &windows::Foundation::IInspectable) -> Result<()> { // 获取并激活核心窗口 let window = CoreApplication::MainView()?.CoreWindow()?; window.Activate()?; // 在UI线程调度器中调用捕获选择器 let picker_handler = DispatchedHandler::new(|| -> Result<()> { let picker = GraphicsCapturePicker::new()?; match picker.PickSingleItemAsync()?.get()? { Some(capture_item) => println!("选中捕获对象ID: {:?}", capture_item.Id()), None => println!("未选择任何对象"), } Ok(()) }); window.Dispatcher()?.RunAsync(CoreDispatcherPriority::Normal, picker_handler)?; Ok(()) } fn main() -> Result<()> { // 检查系统是否支持屏幕捕获 let is_supported = windows::Graphics::Capture::GraphicsCaptureSession::IsSupported()?; println!("支持屏幕捕获: {}", is_supported); // 启动UWP应用框架,初始化主视图 CoreApplication::Run(ApplicationInitializationCallback::new(|_| -> Result<()> { let main_view = CoreApplication::MainView()?; // 绑定视图激活事件 main_view.Activated(&CoreApplicationViewActivatedEventHandler::new(on_view_activated))?; Ok(()) }))?; Ok(()) }
关键说明
- CoreApplication::Run:这是UWP应用的核心入口,必须调用它来启动应用框架,创建主视图并维护消息循环,没有这一步就无法生成有效窗口上下文。
- 窗口激活事件:必须等主窗口激活后(
Activated事件触发)才能调用UI组件,否则Picker无法获取窗口上下文。 - CoreDispatcher线程调度:所有UI相关操作必须在UI线程执行,通过
RunAsync将Picker的调用调度到UI线程。
文档参考思路
windows-rs是直接映射WinRT API的绑定库,因此微软官方的UWP核心文档(如CoreApplication、CoreWindow的说明)完全适用。你可以对照C#示例的逻辑,将方法名转换为Rust的驼峰调用方式即可,比如C#的CoreApplication.MainView.CoreWindow对应Rust的CoreApplication::MainView()?.CoreWindow()?。
内容的提问来源于stack exchange,提问作者MEisebitt
相关产品推荐
相关产品推荐

