【问题标题】:UWP App crashes when Clipboard.GetContent() is called from inside OnNavigatedTo()当从 OnNavigatedTo() 内部调用 Clipboard.GetContent() 时,UWP 应用程序崩溃
【发布时间】:2019-11-15 17:36:04
【问题描述】:

在 UWP 应用中,当我尝试从 OnNavigatedTo 方法中检索剪贴板的内容时,应用会崩溃。请问有人可以帮忙吗?

编辑:它似乎只有在通过从开始菜单单击它或通过另一个应用程序启动它来启动它时才会崩溃。但是当由 Visual Studio 启动时,它运行良好!

【问题讨论】:

  • 我猜你是在初始导航中这样做的,在你的应用程序获得焦点之前。只有焦点应用可以访问剪贴板。
  • 那么,您有什么建议作为解决方案?即我可以以某种方式以编程方式将我的应用设置为焦点吗?
  • 等到您的应用获得焦点,然后在那时获取剪贴板。甚至更好:等待用户执行指示他们希望您的应用从剪贴板检索信息的操作。自发读取剪贴板的应用程序通常被视为可疑(信息窃取)。

标签: .net uwp win-universal-app windows-10-universal


【解决方案1】:

Visual Studio 中的调试与开始菜单不同,你可以在 vs 中运行应用时尝试 Resuming 和 Suspending 事件,这些事件不会正常触发。

另外,关于剪贴板,document 提到你需要在 CoreWindow 激活后使用剪贴板。当 OnNavigatedTo 事件被触发时,CoreWindow 还没有准备好。你可以试试下面的代码,Activated事件会触发很多次,你可以在里面添加一些判断。

public MainPage()
{
    this.InitializeComponent();
    CoreWindow window = CoreWindow.GetForCurrentThread();
    window.Activated += Window_Activated; 

}

private async void Window_Activated(CoreWindow sender, WindowActivatedEventArgs args)
{
    var dataPackageView = Clipboard.GetContent();
    var text = await dataPackageView.GetTextAsync();
}

【讨论】:

    【解决方案2】:

    如果你在OnNavigatedTo 或更早的时候使用Clipboard 没有问题(比如在页面构造函数中),但是你必须从 UI 线程调用Clipboard API。意味着以下将起作用:

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        var content = Clipboard.GetContent();
    }
    

    但以下会崩溃:

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        await Task.Run(() => { Clipboard.GetContent(); });
    }
    

    请确保您的代码确实从 UI 线程访问了 Clipboard 并且它应该可以正常工作。要移动到 UI 线程,您可以使用 Dispatcher(参见例如 this SO question

    【讨论】:

    • 其实第一个代码和第二个代码都不行!
    • 这太不寻常了。您能否创建一个简单的示例项目并将其放在 GitHub 上,以便我在本地进行测试?
    • 我现在意识到只有在从剪贴板检索数据后调用另一个应用程序时才会出现问题。我的意思是使用如下代码: protected override async void OnNavigatedTo(NavigationEventArgs e) { DataPackageView dataPackageView = Clipboard.GetContent(); bool 结果 = 等待 Windows.System.Launcher.LaunchUriAsync(new Uri("ms-screensketch:edit"));如果应用程序由 Visual Stuido 启动,则不会发生这种情况,但只有当用户通过在已安装程序列表中单击其名称来启动它时。
    • 我现在意识到即使没有调用其他应用程序也会崩溃。只需尝试通过单击开始菜单中的程序名称来启动它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2016-08-27
    • 2022-12-12
    • 2011-03-24
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多