lisz-works

技術系だけど関係ないこと多い系ブログ

LavVIEW キー入力の判定で「CAPIT」が邪魔でうまくいかない時の対処

【スポンサーリンク】

LabVIEWロゴ

LabVIEWのキー同時押しロジックの動作確認をしていました。

すると「CAPIT」という要素が邪魔で、想定通りの挙動にならないという現象が発生したので、そのお話です。

結論

CapsLockが知らぬ間にONになっており、CapsLockキーの常に受けている状態になっていた。

その為、想定していた同時押しのキーと異なる状態となっていたので、動作しなかった。

状況

LabVIEWで複数キーの入力をしようとしたらうまくいかなかった。

ロジックはこちら。

キー入力ロジック

入力デバイスをクエリ
↓
キーボードをクリア
↓ ID、エラー出力
入力データを取得
↓ 押されたキー
押されたキーを処理

左Ctrl+左Shift+A」を想定しています。

下記のように接続し、キー同時押下を取得・判定しようとした。

しかし「CAPIT」という要素のせいで判定をうまく通過しなかった。

解決

「CAPIT」は「CapsLock」でした。

CapsLockがかかった状態で、同時押し判定をしようとすると、CapsLockよりも優先順位が低いキーが、CAPITより後ろの配列に入ることとなってしまうようです。

なのでCapsLock有効時を加味する場合、この優先度を考慮して、判定を作成する必要がある。

今回は入力ミスなのでこのままとした(CapsLock OFFじゃないと通らないまま)。

解説

なぜこうなるのか?

「入力データの取得」による、「出力:押されたキー」は、keyType列挙体配列となっている。 この配列を分解し、[0]~[N]を取得すると、複数個同時押下したキーに分解できる。

例えば、「左Ctrl+左Shift+A」を入力すると

idx key
[0] A
[1] LCONT(左Ctrl)
[2] LSHIFT(左Shift)

となる。

しかしCapsLockがONの場合、「左Ctrl+左Shift+A」と入力した場合

idx key
[0] A
[1] CAPIT
[2] LCONT(左Ctrl)
[3] LSHIFT(左Shift)

のようになる。

これはCapsLockが、CtrlShiftなどより優先となっている為である。

またなにも押下していない時

idx key
[0] CAPIT

となっている。

CapsLockを許容する場合、どうすればいいのか?

  1. 判定にCapsLockがONだった場合を想定したものを入れる。
  2. 仕様としてCapsLockがON時を対象外とする。

環境

LabVIEW 2016

昔のバージョンでも恐らく同じかと思います(未検証)。

あとがき

割と凡ミスに近い気がしますが、よくわからなかったので「なんだこれ……」と混乱……(笑)

多少時間を喰ってしまいました(苦笑)

「LabVIEW CAPIT」とかで調べてもなんか出てこなかったので、「CAPITってなんやねん」ってずっとなってました。

わかるとあっさりですね……