かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

現在押されているキーと修飾キーを取得する

ぱぱっと取れるものなのかしら。と思ってみたら若干めんどくさかった。

現在押されているキー

Window.Current.CoreWindowのGetKeyStateで指定したキーが押されたかどうかわかるので、VirtualKey全走査すればいいのか?修飾キーあたり排除してFirstOrDefaultっと・・・。動かしてません・・・!

var vkyes = VirtualKeys = Enum
    .GetValues(typeof(VirtualKey))
    .Cast<VirtualKey>()
    .Where(k => k != VirtualKey.Menu && 
        k != VirtualKey.LeftWindows && 
        k != VirtualKey.Control && 
        k != VirtualKey.Shift)
    .ToArray();

var currentKey = vkeys.FirstOrDefault(k =>
    Window.Current.CoreWindow.GetKeyState(k) == CoreVirtualKeyStates.Down);

現在押されている修飾キー

VirtualKeyModifiersで表してるらしい。これもCoreWindowのGetAsyncKeyStateみたいなメソッドで押せるかどうか判別できるらしい。まぁ、これくらいの数なら愚直にやってもいいかなってことで押されてる奴を|=でつないでいく。

var m = VirtualKeyModifiers.None;
if (Window.Current.CoreWindow.GetAsyncKeyState(VirtualKey.Shift) == CoreVirtualKeyStates.Down)
{
    m |= VirtualKeyModifiers.Shift;
}
if (Window.Current.CoreWindow.GetAsyncKeyState(VirtualKey.Control) == CoreVirtualKeyStates.Down)
{
    m |= VirtualKeyModifiers.Control;
}
if (Window.Current.CoreWindow.GetAsyncKeyState(VirtualKey.Menu) == CoreVirtualKeyStates.Down)
{
    m |= VirtualKeyModifiers.Menu;
}
if (Window.Current.CoreWindow.GetAsyncKeyState(VirtualKey.LeftWindows) == CoreVirtualKeyStates.Down)
{
    m |= VirtualKeyModifiers.Windows;
}

まとめ

MSDN見ながら書いただけで動かしてないので間違えてる可能性大。次の記事で、これを使ってあれをする・・・!予定。