none
WPF 「Shift」単独キーと「Shift+?」の複合キーを、キーを押された時点で判別できるでしょうか RRS feed

  • 質問

  • お世話になります。
    WPFアプリケーションでも、キー判定についての質問です。

    現在、C#によるWPFアプリケーション開発を行っています。
    (.NET Framework4.0)

    アプリケーションのインストール先は、PCではなく特殊なハードウェアで、
    PCとは異なるキーボード配置のため、
    Shift+?
    Ctrl+?
    Alt+?
    (?は任意のキー)
    のような特殊なキーが、割りあたっていることがあります。

    このような環境で、
    ・「Shift+Tab」という複合キー(H/W的にはひとつのキー)が押された場合と、
    ・「Shift」という単独のキーが押された場合
    で、それぞれ別の振る舞いをさせたいのですが、何か良い識別方法はないでしょうか?

    操作時のスピード感を求めることもあり、キーが離されたタイミングではなく、
    押されたタイミングで、アプリケーションが反応するようにしたいのですが、
    名案が浮かばずに困っています。

    実機にて、各種キーを押したときの関連イベントの発生順と、各イベント発生時の
    System.Windows.Input.Keyboard.Modifiers プロパティは、下記のとおりでした。

    <pre>
    (1)「Shift+Tab」
     Window_PreviewKeyDown:LeftShift >> Keyboard.Modifiers:Shift
     Window_KeyDown       :LeftShift >> Keyboard.Modifiers:Shift
     Window_PreviewKeyDown:Tab       >> Keyboard.Modifiers:Shift
     Window_KeyDown       :Tab       >> Keyboard.Modifiers:Shift
     Window_PreviewKeyUp  :Tab       >> Keyboard.Modifiers:Shift
     Window_KeyUp         :Tab       >> Keyboard.Modifiers:Shift
     Window_PreviewKeyUp  :LeftShift >> Keyboard.Modifiers:None
     Window_KeyUp         :LeftShift >> Keyboard.Modifiers:None
    (2)「Space」
     Window_PreviewKeyDown:Space     >> Keyboard.Modifiers:None
     Window_PreviewKeyUp  :Space     >> Keyboard.Modifiers:None
     Window_KeyUp         :Space     >> Keyboard.Modifiers:None
    (3)「Shift」
     Window_PreviewKeyDown:LeftShift >> Keyboard.Modifiers:Shift
     Window_KeyDown       :LeftShift >> Keyboard.Modifiers:Shift
     Window_PreviewKeyUp  :LeftShift >> Keyboard.Modifiers:None
     Window_KeyUp         :LeftShift >> Keyboard.Modifiers:None
     Window_PreviewKeyUp  :LeftShift >> Keyboard.Modifiers:None
     Window_KeyUp         :LeftShift >> Keyboard.Modifiers:None
    (4)USBのPCキーボードを接続して「Shift」
     Window_PreviewKeyDown:LeftShift >> Keyboard.Modifiers:Shift
     Window_KeyDown       :LeftShift >> Keyboard.Modifiers:Shift
     Window_PreviewKeyUp  :LeftShift >> Keyboard.Modifiers:None
     Window_KeyUp         :LeftShift >> Keyboard.Modifiers:None
    (5)USBのPCキーボードを接続して「Tab」
     Window_PreviewKeyDown:Tab       >> Keyboard.Modifiers:None
     Window_KeyDown       :Tab       >> Keyboard.Modifiers:None
     Window_PreviewKeyUp  :Tab       >> Keyboard.Modifiers:None
     Window_KeyUp         :Tab       >> Keyboard.Modifiers:None
    </pre>

    上記を見る限り、判別は難しそうです。

    WindowsForms+VB6 の時には、
    Form_KeyDown(KeyCide As Integer, Shift As Integer)
    のShiftを見て判定していたように思いますが、
    WPF+C# でも、何か手っ取り早い識別方法は無いものでしょうか。

    何か情報をお持ちの方がいらっしゃいましたら、是非ご教授ください。

    2012年3月7日 9:07

回答

  • SHIFT + TABというのは、SHIFTキーを押しながらTABキーを押すということですから、最初にShiftキーが押された時点では、その後にTABキーが押されるかどうかわかりませんので、原理的にShiftのみなのか、SHIFT + TABなのかを判断することは不可能です。
    SHIFTキーのみが押されたと判断するには、一定期間SHIFTキーが押され続けているということぐらいでしか判断できないと思います。
    TABキーが押された時点で、その前にSHIFTキーが押されたままであるかどうかは、以下のようにすれば判断できます。

    if (e.Key == Key.Tab)
    {
        if (Keyboard.Modifiers == ModifierKeys.Shift)
            System.Diagnostics.Debug.WriteLine("Shift + TAB");
        else
            System.Diagnostics.Debug.WriteLine("TAB");
    }


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 山本春海 2012年3月22日 8:17
    • 回答としてマーク 山本春海 2012年3月23日 8:21
    2012年3月8日 2:15
    モデレータ

すべての返信

  • SHIFT + TABというのは、SHIFTキーを押しながらTABキーを押すということですから、最初にShiftキーが押された時点では、その後にTABキーが押されるかどうかわかりませんので、原理的にShiftのみなのか、SHIFT + TABなのかを判断することは不可能です。
    SHIFTキーのみが押されたと判断するには、一定期間SHIFTキーが押され続けているということぐらいでしか判断できないと思います。
    TABキーが押された時点で、その前にSHIFTキーが押されたままであるかどうかは、以下のようにすれば判断できます。

    if (e.Key == Key.Tab)
    {
        if (Keyboard.Modifiers == ModifierKeys.Shift)
            System.Diagnostics.Debug.WriteLine("Shift + TAB");
        else
            System.Diagnostics.Debug.WriteLine("TAB");
    }


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 山本春海 2012年3月22日 8:17
    • 回答としてマーク 山本春海 2012年3月23日 8:21
    2012年3月8日 2:15
    モデレータ
  • trapemiya様

    ご回答ありがとうございます。

    キーダウンにて判断必要な場合、Shiftつきキーを使うのであれば、ShiftキーのみのDownがない、という前提のもと、利用する、という考えで進めてみたいと思います。

    2012年6月5日 13:45