目标: 使用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.
真诚地感谢你的帮助。谢谢你的帮助。
WinRT剪贴板API只能从带有CoreWindow的UI线程中调用。请看注释 在文件中. 你可以在你的控制台应用程序中使用常规的Win32剪贴板API。