vs2015の「DirectX 11およびXAML App(ユニバーサルウィンドウ)」テンプレートを使用しています。私はすべてのフレームでユーザーのキーストロークを取得したい。そこで、GetAsyncKeyState()をレンダリングループの内部に配置しようとしました。レンダリングループは、別のスレッドで実行されている:別のスレッドからのUWP GetAsyncKeyState()
auto workItemHandler = ref new WorkItemHandler([this](IAsyncAction^action)
{
// Calculate the updated frame and render once per vertical blanking interval.
while (action->Status == AsyncStatus::Started)
{
critical_section::scoped_lock lock(m_criticalSection);
Update();
m_sceneRenderer->OnKeyDown();
if (Render())
{
m_deviceResources->Present();
}
}
});
// Run task on a dedicated high priority background thread.
m_renderLoopWorker = ThreadPool::RunAsync(workItemHandler, WorkItemPriority::High, WorkItemOptions::TimeSliced);
m_sceneRenderer->は、OnKeyDown()私はGetAsyncKeyStateを置く場所です()。しかし、whileループの中にm_sceneRenderer-> OnKeyDown()を置くたびに、すべてのDirectXコンテンツはレンダリングされません。また、m_renderLoopWorkerはnullptrになり、アプリケーションを閉じると例外がスローされます。
// Sample3DSceneRenderer.h, truncated
namespace UWP_DX11_XAML_
{
class Sample3DSceneRenderer
{
Sample3DSceneRenderer(Windows::UI::Core::CoreWindow^ window);
void OnKeyDown();
Platform::Agile<Windows::UI::Core::CoreWindow^> m_window;
}
}
// Sample3DSceneRenderer.cpp, truncated
UWP_DX11_XAML_::Sample3DSceneRenderer::Sample3DSceneRenderer(
Windows::UI::Core::CoreWindow^ window):
m_window(window)
{
}
void UWP_DX11_XAML_::Sample3DSceneRenderer::OnKeyDown()
{
m_window.Get()->GetAsyncKeyState(Windows::System::VirtualKey::Control);
}
m_windowの他のメンバ関数を呼び出すと、同じ問題が発生する可能性があります。
CreateCoreIndependentInputSource()それは、キーボードイベント、ちょうどペン/タッチ/マウスを扱うようには見えません。それはキーボードをすることはできますか? –