0
キーが押されて保持されると、CoreDispatcher :: AcceleratorKeyActivatedイベントが発生し、KeyStatus.WasKeyDownフィールドは常にfalseになります。 CoreWindow :: KeyDownイベントにWasKeyDownが正しく設定されています。実際には、最近振る舞いが変わったようです。以前はキーを保持するとKeyDown/KeyUpイベントが発生していましたが、現在はKeyDownのみが発生しています。誰かがこれを確認できますか?AcceleratorKeyActivatedイベントargs KeyStatus.WasKeyDownフィールドは、キーが押されても常にfalseです。
// IFrameworkView::SetWindow implementation
public: virtual void
SetWindow(::Windows::UI::Core::CoreWindow^h_window)
{
h_window->Dispatcher->AcceleratorKeyActivated += ref new ::Windows::Foundation::TypedEventHandler
<
::Windows::UI::Core::CoreDispatcher^
, ::Windows::UI::Core::AcceleratorKeyEventArgs^
>
(this, &CView::On_Key);
h_window->KeyDown += ref new ::Windows::Foundation::TypedEventHandler
<
::Windows::UI::Core::CoreWindow^
, ::Windows::UI::Core::KeyEventArgs^
>
(this, &CView::On_KeyDown);
h_window->KeyUp += ref new ::Windows::Foundation::TypedEventHandler
<
::Windows::UI::Core::CoreWindow^
, ::Windows::UI::Core::KeyEventArgs^
>
(this, &CView::On_KeyUp);
}
private: static void
Trace_InputEvent
(
wchar_t const * psz_description
, ::Windows::System::VirtualKey const virtual_key
, bool const was_down
, bool const is_released
, unsigned int const repeats_count
)
{
::std::wstringstream ss;
ss << psz_description;
ss << L" " << static_cast<int>(virtual_key);
if(was_down)
{
ss << L" was down";
}
if(is_released)
{
ss << L" is released";
}
if(1 < repeats_count)
{
ss << L" repeats for " << repeats_count;
}
ss << L"\n";
ss.flush();
::OutputDebugStringW(ss.str().c_str());
}
private: void
On_Key
(
::Windows::UI::Core::CoreDispatcher^ h_dispatcher
, ::Windows::UI::Core::AcceleratorKeyEventArgs^h_args
)
{
auto const key_down
{
(::Windows::UI::Core::CoreAcceleratorKeyEventType::SystemKeyDown == h_args->EventType)
||
(::Windows::UI::Core::CoreAcceleratorKeyEventType::KeyDown == h_args->EventType)
};
auto const key_up
{
(::Windows::UI::Core::CoreAcceleratorKeyEventType::SystemKeyUp == h_args->EventType)
||
(::Windows::UI::Core::CoreAcceleratorKeyEventType::KeyUp == h_args->EventType)
};
if(key_down || key_up)
{
Trace_InputEvent
(
(key_down ? L"On_Key(Down)" : L"On_Key(Up)")
, h_args->VirtualKey
, h_args->KeyStatus.WasKeyDown
, h_args->KeyStatus.IsKeyReleased
, h_args->KeyStatus.RepeatCount
);
}
//h_args->Handled = true; // Marking event as handled prevents On_KeyDown/On_KeyUp events from being emmitted.
}
private: void
On_KeyDown
(
::Windows::UI::Core::CoreWindow^ h_dispatcher
, ::Windows::UI::Core::KeyEventArgs^h_args
)
{
Trace_InputEvent
(
L"On_KeyDown"
, h_args->VirtualKey
, h_args->KeyStatus.WasKeyDown
, h_args->KeyStatus.IsKeyReleased
, h_args->KeyStatus.RepeatCount
);
}
private: void
On_KeyUp
(
::Windows::UI::Core::CoreWindow^ h_dispatcher
, ::Windows::UI::Core::KeyEventArgs^h_args
)
{
Trace_InputEvent
(
L"On_KeyUp"
, h_args->VirtualKey
, h_args->KeyStatus.WasKeyDown
, h_args->KeyStatus.IsKeyReleased
, h_args->KeyStatus.RepeatCount
);
}
押すとホールドスペースバー出力:
On_Key(Down) 32
On_KeyDown 32
On_Key(Down) 32
On_KeyDown 32 was down
On_Key(Down) 32
On_KeyDown 32 was down
...
On_Key(Down) 32
On_KeyDown 32 was down
On_Key(Up) 32 was down is released
On_KeyUp 32 was down is released
は、しかし、あなたの回避策が正しくないと、説明をいただき、ありがとうございます。そのキーが現在停止していることを確認することは、停止したことを確認することと同じではありません。最初のキーダウンイベント(was_downがfalse)と、キーが押されている間に連続したキーダウンイベントとを区別することはできません。私は手動で適切に "was_down"をチェックできるように、関心のあるすべてのキーの押された状態を追跡する必要があると思います。 – dodo951
また、私は何かがMSDNフォーラム検索で間違っていることを言及する必要があります。たとえば、[AcceleratorKeyEventArgsの検索](https://social.msdn.microsoft.com/Forums/windowsapps/en-US/home?searchTerm=AcceleratorKeyActivated+)では、ランダムに3つの結果が得られます。 – dodo951
@ dodo951 MSDNフォーラムを使用する際に問題がある場合は、こちらから報告してください。https://social.msdn.microsoft.com/Forums/windowsapps/en-US/home?forum=reportabug –