single.php

C#[VIA]で設定したレイヤーを可視化するアプリの作ってみた(その3)

対応するキーボードのキーマップを変更する[VIA]には編集したキーの配置をまとめて管理する[レイヤー]機能があります。利用すると1つのキーに複数の役割を設定できるので便利ですが、今回は先回制作したモニターに表示するアプリを改良してみました。

VIAのレイヤー機能

対応するキーボードのキーマップを変更する[VIA]には編集したキーの配置をまとめて管理する[レイヤー]機能があります。

例えば、通常のキーボードの[A]キーは、アルファベットの “a” が入力されますが[Shift]キーと同時に使うと “A” が入力できます。

また、Windowsの場合[Ctrl]キーと同時に使うと[すべて選択]機能を呼び出す際にも利用できます。

こんな感じで[レイヤー]を使うと1つのキーに複数の機能を割り振ることが可能になります。

Amazonでも対応したキーボードや関連デバイスが販売されていて、私が購入した「EPOMAKER EK21 VIA ガスケット テンキー ゲーミングキーボード ワイヤレスメカニカルテンキー」でも便利に使っています。

このレイヤー機能を使えば、20個のキーであれば最大80個までキーが登録できます。

非常に便利なんですが、キートップの印刷が変わる訳ではないので、残りの60個の機能と配置場所は覚える必要があります。

キーマップを画面に表示

先回、[VIA]を使ってレイヤーを切り替える操作と、アプリに伝えるためのキー操作の設定を行いました。

簡単に説明すると、[Fn]キーを押している間は、レイヤーを移動する機能とキーを短押しすると[F20]と言った特殊なキーを送信します。

詳しい設定方法などは、別記事をご覧ください。

タスクトレイに常駐するWindowsアプリにしたので、C#のWinFormプロジェクトで[KeyLayerView]として作成しました。

修飾キーとの組み合わせを設定

先回までに制作したアプリを使っていて少し欲しくなった改良点が修飾キーとの組み合わせ。

キーに設定できるのを[F20]など単キーのみなので、もう少しキーが欲しくなります。

なので[Shift]や[Alt]など修飾キーと呼ばれるキーとの組み合わせを可能にしてみました。

[setting]フォルダー内のJSONファイルにはQmkKeyの書式に習って修飾キーとの組み合わせを設定する形を追加しました。(下記コードの”S(KC_F20″部分)

{
  "KC_F20": "Images/layer0.png",
  "KC_F21": "Images/layer1.png",
  "KC_F22": "Images/layer2.png",
  "KC_F23": "Images/layer3.png",
  "S(KC_F20)": "Images/layer0.png"
}

Win32 APIのGetKeyState関数を呼び出せるように[DllImport]を追加します。

public class Win32VirtualKey
{
    public const int VK_SHIFT = 0x10;
    public const int VK_CONTROL = 0x11;
    public const int VK_MENU = 0x12;
    public const int VK_LWIN = 0x5B;
    public const int VK_RWIN = 0x5C;
}

public bool IsKeyDown(int vk)
{
    return (GetKeyState(vk) & 0x8000) != 0;
}

[DllImport("user32.dll")]
static extern short GetKeyState(int nVirtKey);

実際に使う部分は、次の様に修正しました。

private static string BuildQmkKey(string baseKey, bool shift, bool ctrl, bool alt, bool win)
{
    string key = baseKey;

    if (shift) key = $"S({key})";
    if (ctrl) key = $"C({key})";
    if (alt) key = $"A({key})";
    if (win) key = $"G({key})";

    return key;
}

private void OnVirtualKeyPressed(int vkCode)
{
    if (!QmkKeyMap.VkToQmk.TryGetValue(vkCode, out var baseKey))
        return;

    if(_keyboardHook == null)
        return;

    // 修飾キー判定
    bool shift = IsKeyDown(VK_SHIFT);
    bool ctrl = IsKeyDown(VK_CONTROL);
    bool alt = IsKeyDown(VK_MENU);
    bool win = IsKeyDown(VK_LWIN) || IsKeyDown(VK_RWIN);

    // QMKキー文字列を組み立て
    string qmkKey = BuildQmkKey(baseKey, shift, ctrl, alt, win);

    if (!_layerMap.TryGetValue(qmkKey, out var imageFile))
        return;

    if (_currentLayerKey == qmkKey && _form!.Visible)
    {
        _form.Hide();
        _currentLayerKey = null;
        return;
    }

    if (!ImageCache.TryGet(imageFile, out var image))
        return;

    _currentLayerKey = qmkKey;
    _form!.ShowImage(image);
}

実行するとアプリがタスクトレイに常駐します。

後は[Shift]+[F20]キーを押すとモニターの左下に画像が表示されます。(もう一度押すと、非表示になります)

キーボードに無い[F13]~[F24]を使う場合に[Shift]や[Alt]、[Ctrl]キーを組み合わせることで2~4倍のキー数に増やすことが可能です。

まとめ

対応するキーボードのキーマップを変更する[VIA]には編集したキーの配置をまとめて管理する[レイヤー]機能に対応した画像を画面に表示するアプリの作成を行ってみました。

現在のキーマップが画面に表示されることで、忘れた時にすぐに思い出せるので、かなり便利になりました。

少し使ってみて、表示するキーに修飾キーとの組み合わせが欲しくなったのでコードを追加して取得できるように修正しました。

[VIA]で追加したキーマップを可視化したい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です