You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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(())
}

关键说明

  1. CoreApplication::Run:这是UWP应用的核心入口,必须调用它来启动应用框架,创建主视图并维护消息循环,没有这一步就无法生成有效窗口上下文。
  2. 窗口激活事件:必须等主窗口激活后(Activated事件触发)才能调用UI组件,否则Picker无法获取窗口上下文。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:30:53