2017-03-20 5 views
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 

答えて

1

はRS1における既知の問題があります。ここ

は、いくつかの例です。また、MSDNフォーラムで報告されています。XAMLを使用しているプロセスの間に CoreDispatcher.AcceleratorKeyActivated event: WasKeyDown property behaves differently on 10586.753 and 14393.693 (anniversary edition)

は、AcceleratorKeyEventArgs内部KeyStatusはそうWasKeyDownが間違っている、無視されました。

回避策として、代わりにGetKeyState(VirtualKey)メソッドを使用してください。

private void Dispatcher_AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs args) 
{ 
      var corewindow = CoreWindow.GetForCurrentThread(); 

      System.Diagnostics.Debug.WriteLine("AcceleratorKeyActivated-VirtualKey: " + 
      args.VirtualKey 
      + " -- KeyState: " + 
      corewindow.GetKeyState(VirtualKey.Space));//Here 
} 

出力:

AcceleratorKeyActivated-VirtualKey: Space -- KeyState: Down, Locked 
AcceleratorKeyActivated-VirtualKey: Space -- KeyState: Down, Locked 
AcceleratorKeyActivated-VirtualKey: Space -- KeyState: Down, Locked 
AcceleratorKeyActivated-VirtualKey: Space -- KeyState: Down, Locked 
AcceleratorKeyActivated-VirtualKey: Space -- KeyState: Down, Locked 
AcceleratorKeyActivated-VirtualKey: Space -- KeyState: Locked 
+0

は、しかし、あなたの回避策が正しくないと、説明をいただき、ありがとうございます。そのキーが現在停止していることを確認することは、停止したことを確認することと同じではありません。最初のキーダウンイベント(was_downがfalse)と、キーが押されている間に連続したキーダウンイベントとを区別することはできません。私は手動で適切に "was_down"をチェックできるように、関心のあるすべてのキーの押された状態を追跡する必要があると思います。 – dodo951

+0

また、私は何かがMSDNフォーラム検索で間違っていることを言及する必要があります。たとえば、[AcceleratorKeyEventArgsの検索](https://social.msdn.microsoft.com/Forums/windowsapps/en-US/home?searchTerm=AcceleratorKeyActivated+)では、ランダムに3つの結果が得られます。 – dodo951

+0

@ dodo951 MSDNフォーラムを使用する際に問題がある場合は、こちらから報告してください。https://social.msdn.microsoft.com/Forums/windowsapps/en-US/home?forum=reportabug –

関連する問題