独学でプログラミングを勉強してGAFAに入社するまでの話 – Qiita

これによると

ITの世界に身を投げたあなたは最初に何をすべきか?プログラミング言語を学ぶ?IT塾に通う?参考書を買う?
違う!!!まずは、タイピングだ。

当たり前の話だが、タイピングの遅いやつは仕事が遅い。ブラインドタッチができないやつは、話にならない。サッカーで例えるならば、リフティングもできないのにシュートの仕方を学んでいるようなものだ。

ブラインドタッチできることがエンジニアとしての超最低レベルだ。

とのこと。そこでタイピング練習アプリをつくることにしました。実はすでにその記事を公開しているのですが、その改良型をつくります。タイピングに関しては以下が参考になります。練習メニューもここを参考にしました。

練習メニューができるようになっています。左から右に順番にという簡単なものから複雑なものになっています。

1-1(左手中段)
FDSA
ASDF
FDSASDF
AFSD
SADF
FDAS

1-2(右手中段)
JKL;
;LKJ
JKL;LKJ
JLK;
;KJL
ASDFJKL;

2-1(左手上段)
TREWQ
QWERT
TREWQWERT
EWQTR
QTWRE
WQRET

2-2(右手上段)
YUIOP
POIUY
YUIOPOIUY
YUPIO
IPYOU
POOYI

2-3(両手上段)
QWERTYUIOP
POIUYTREWQ

3-1(両手下段)
ZXCVBNM
MNBVCXZ
BXMZVNC
XNCMZVB

4-1(左手人差し指)
TRGFBV
VBFGRT
FBVTRG
GVRBTF
BTFRGV
YUHJNM

4-2(右手人差し指)
YUHJNM
MNHJYU
HUYJNM
JNUHMY
YHMJNU

5-1(両手中指)
EDCIK
EICDE
CKDIE
EIDKC
EKCID

5-2(両手人差し指+中指)
HIJIKIRENNJI
GENNKIDEKIRU

6-1(左手薬指小指)
QWASZX
XZSAWQ
WASXZQ
AXQZWS
XZAQSW

6-2(右手薬指小指)
OPLPO
PLOLP
LOPOL
OLPLO

6-3(両手薬指小指)
ASPWOL
QXOZAP
SZWLQO
PLAOXZ

7-1(母音)
AIUEO
AIUUE
AEIUO
AOIUE
OEUIA
OIEEU

8(50音)
AIUEO KAKIKUKEKO SASISUSESO TATITUTETO NANINUNENO MAMIMUMEMO YAYUYO RARIRURERO WAWONN

9(記号)
.,!?[]()-~

10(数字)
2581736409

まずLessonクラスを作成します。プロパティは文字の配列とメニューに表示する文字列です。

ではメニューに表示させましょう。

Lessonsのリストを作成してこれをもとにToolStripMenuItemオブジェクトを作成します。

次にメニューが選択されたらお題の文字列が表示されるようにします。

ShowNextChar()はお題の文字列が表示させるためのメソッドです。[ナビ] ⇒ [次のキー]がチェックされている場合、該当するラベルの背景色を赤に変更します。また[ナビ] ⇒ [指]がチェックされている場合、使う指に該当するラベルの背景色をピンク色に変更します。

ラベルの背景色を変更するときはそれまで変更されていたものを元に戻す必要があります。GetAllLabels()はフォーム上のラベルをすべて取得するためのメソッドです。ラベルの背景色を変更するときは、いったんそれまで変更されていたものを元に戻してから処理をしています。

キーに対応したラベルを求めるGetLabelFromChar(char c)メソッドとGetFingerLabelFromChar(char c)メソッドを示します。前者はキーから対応するラベルを、後者はキーから指のラベルを取得します。

キーがおされたら正しくキーが押されたかしらべて結果を表示します。そのためのメソッドがJudgePressKey(char char0, char press)です。正しければ”OK!”、まちがっていれば”Miss!”と表示します。間違っている場合は、そのまま次のお題に進むか正しく入力できるまで進めないかを設定できるようにしています。

ShowPressKey(char c)メソッドは実際に押されたキーがどれなのかを表示するものですが、[ナビ] ⇒ [押されたキー]がチェックされていないと表示されません。[ナビ] ⇒ [押されたキー]がチェックされている場合、該当するラベルの背景色をオレンジ色に変更します。

ShowPressKey(char c)メソッドでは左右のSHIFTキーを区別しています。

ところでSHIFTキーが押されているかどうかは以下のコードで知ることができます。

ところが左右のSHIFTキーになると

これではうまくいきません。WindowsのC#でキーをリアルタイムに取得する方法 – QiitaによるとWINAPIを使用してキーを取得するしかないようです。そこで以下のようにしています。

キーが離された場合、正しく入力できていた場合は次に進みます。間違っていた場合は[設定] ⇒ [間違って入力した場合もそのまま続ける]にチェックがされていない場合だけ次に進みます。

最後にチェックボックスの状態を変更するイベントハンドラを示します。