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が、CtrlやShiftなどより優先となっている為である。
またなにも押下していない時
idx | key |
---|---|
[0] | CAPIT |
となっている。
CapsLockを許容する場合、どうすればいいのか?
- 判定にCapsLockがONだった場合を想定したものを入れる。
- 仕様としてCapsLockがON時を対象外とする。
環境
LabVIEW 2016
昔のバージョンでも恐らく同じかと思います(未検証)。
あとがき
割と凡ミスに近い気がしますが、よくわからなかったので「なんだこれ……」と混乱……(笑)
多少時間を喰ってしまいました(苦笑)
「LabVIEW CAPIT」とかで調べてもなんか出てこなかったので、「CAPITってなんやねん」ってずっとなってました。
わかるとあっさりですね……