2015年11月13日金曜日

C#でスクリーンキーボード

ナショジオのAH-64組み立て番組見てたらキーボードが面白そうだったのでC#で作ってみた(ソフトウェアキーボード)。


もちろん普通にスクリーンキーボードとして使用可能である(といっても、IME切り替えキーは無いので英語圏の入力のみだけど)。AH-64って2人乗りとはいえ、飛んでる間に左手で長文を入力するとも思えないし、ちょっとした情報の入力程度にしか使わないんだろうけど、入力しやすいとは思えないなぁ。

一応形だけは作ったけど、例えばZの横にあるスラッシュと、Enterの上にある除算記号は同一の文字が入力される。また±キーは本来であれば入力値の正負が反転されるはずなんだけど、Winではそれっぽいキーは無い気がするので今のところ何も割り当てられていない。CLRはKeys.Clearを割り当てている。ただnotepad.exeではClearは何も行わないみたい。

スクリーンキーボードは大きさ固定のユーザーコントロールとして作成している。そのため他のプロジェクトに貼り付けることも可能。各キーはButtonを継承したコントロールを使用している(円形表示や四角の枠を表示するため)。ボタン間の分割ラインはLabelのAutoSizeをFalseにしたうえで使用している。他にはボタンが押されたらそのボタンに応じてKeysをEventで渡せるようにしている。

スクリーンキーボードとして使用するには、1)スクリーンキーボードが押されてもアクティブにならない 2)キーを送信する という動作が必要になる。今回は .netで何かつくろう スクリーンキーボードの作成 を参考にした。キーを送信するにはkeybd_eventを使用しているが、C#にはSendKeyというクラスがある。もっとも、keybd_eventならKeysをbyteにキャストするだけで良いのでDLLを使ったほうが簡単だと思う。

Formを常に最前面に表示するにはTopMostをTrueにすればいいらしい。が、僕の環境ではこれだけではダメだった。「デザイナのプロパティでTopMostをTrueにする」かつ、「LoadイベントでTopMostにtrueを入れる」という操作が必要だった。どちらか片方ではダメで、LoadではなくFormのコンストラクタで代入してもダメだった。ということで今回はデザイナでTrueにしつつ、コンストラクタでLoadに匿名メソッドを追加することで設定した。

マウスで操作する上ではスクリーンキーボードは大して便利ではないし、ハードウェアキーボードがあるなら選択肢にもならないが、タッチパネルなPCなら、ちょっとした入力程度ならそこそこ便利。ウチにあるタッチパネルはHDMI/USB接続の液晶だけなので部屋でしか使えないし、それならハードウェアキーがあるから、とりあえずは不要かな。

0 件のコメント:

コメントを投稿