かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

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

現在押されているキー

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