当从剪贴板获取内容时,得到 "应用程序为不同线程调用了一个接口 "的错误。

问题描述 投票:0回答:1

目标: 使用C++WinRT APIs从剪贴板获取内容。

遇到的问题:

因为我只是在测试这个API,所以我试着用阻塞的方式来编写一个简单的控制台应用。get() 方法,但我得到的是Clipboard的异步文本获取器。然而,我得到的是 "应用程序调用了一个为不同线程调用的接口" 调试时出错。我也试着将公寓初始化为单线程公寓(STA),但我想这是不允许的,因为另一个断言错误(!is_sta())被抛出。现在我只是想知道为什么调用get时会抛出这个错误,以及如何在我的控制台应用程序中从剪贴板中检索内容。(我看到一些例子(大部分是GUI应用程序)使用的是coroutine,虽然我不熟悉。)

编码:

using namespace winrt::Windows::ApplicationModel::DataTransfer;

int main()
{
    init_apartment();

    hstring text{ Clipboard::GetContent().GetTextAsync().get() };
    std::wcout << text.c_str() << std::endl;
}

错误信息:

Exception thrown at 0x7659ACC2 (KernelBase.dll) in test-clipboard.exe: WinRT originate error - 0x8001010E : 'The application called an interface that was marshalled for a different thread.'.
'test-clipboard.exe' (Win32): Loaded 'C:\Windows\SysWOW64\bcrypt.dll'. 
Exception thrown at 0x7659ACC2 in test-clipboard.exe: Microsoft C++ exception: winrt::hresult_wrong_thread at memory location 0x010FF818.
Unhandled exception at 0x7659ACC2 in test-clipboard.exe: Microsoft C++ exception: winrt::hresult_wrong_thread at memory location 0x010FF818.

真诚地感谢你的帮助。谢谢你的帮助。

c++ windows winapi clipboard c++-winrt
1个回答
0
投票

WinRT剪贴板API只能从带有CoreWindow的UI线程中调用。请看注释 在文件中. 你可以在你的控制台应用程序中使用常规的Win32剪贴板API。

© www.soinside.com 2019 - 2024. All rights reserved.