独学でプログラミングを勉強して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クラスを作成します。プロパティは文字の配列とメニューに表示する文字列です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class Lesson { public Lesson(string title, string str) { Title = title; _str = str; } string _str = ""; public string Title { get; set; } public Char[] Chars { get { return _str.ToArray(); } } } |
ではメニューに表示させましょう。
Lessonsのリストを作成してこれをもとにToolStripMenuItemオブジェクトを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
public partial class Form1 : Form { List<Lesson> Lessons1 = new List<Lesson>(); List<Lesson> Lessons2 = new List<Lesson>(); List<Lesson> Lessons3 = new List<Lesson>(); List<Lesson> Lessons4 = new List<Lesson>(); List<Lesson> Lessons5 = new List<Lesson>(); List<Lesson> Lessons6 = new List<Lesson>(); List<Lesson> Lessons7 = new List<Lesson>(); List<Lesson> Lessons8 = new List<Lesson>(); List<Lesson> Lessons9 = new List<Lesson>(); List<Lesson> Lessons10 = new List<Lesson>(); List<Lesson> Lessons11 = new List<Lesson>(); List<Lesson> Lessons12 = new List<Lesson>(); List<Lesson> Lessons13 = new List<Lesson>(); List<Lesson> Lessons14 = new List<Lesson>(); List<Lesson> Lessons15 = new List<Lesson>(); public Form1() { InitializeComponent(); MenuItemShowNext.Checked = true; MenuItemShowPress.Checked = true; MenuItemShowFinger.Checked = true; labelChar.Text = ""; labelJudge.Text = ""; labelChar.UseMnemonic = false; labelCourse.Text = "コースを選択してください"; InitLesson(); InitLessonMenu(); } void InitLesson() { Lessons1.Add(new Lesson("左手中段 fdsa", "fdsa")); Lessons1.Add(new Lesson("左手中段 asdf", "asdf")); Lessons1.Add(new Lesson("左手中段 fdsasdf", "fdsasdf")); Lessons1.Add(new Lesson("左手中段 afsd", "afsd")); Lessons1.Add(new Lesson("左手中段 sadf", "sadf")); Lessons1.Add(new Lesson("左手中段 fdas", "fdas")); Lessons2.Add(new Lesson("右手中段 jkl;", "jkl;")); Lessons2.Add(new Lesson("右手中段 ;lkj", ";lkj")); Lessons2.Add(new Lesson("右手中段 jkl;lkj", "jkl;lkj")); Lessons2.Add(new Lesson("右手中段 jlk;", "jlk;")); Lessons2.Add(new Lesson("右手中段 ;kjl", ";kjl")); Lessons2.Add(new Lesson("右手中段 asdfjkl;", "asdfjkl;")); Lessons3.Add(new Lesson("左手上段 trewq", "trewq")); Lessons3.Add(new Lesson("左手上段 qwert", "qwert")); Lessons3.Add(new Lesson("左手上段 trewqwert", "trewqwert")); Lessons3.Add(new Lesson("左手上段 ewqtr", "ewqtr")); Lessons3.Add(new Lesson("左手上段 qtwre", "qtwre")); Lessons3.Add(new Lesson("左手上段 wqret", "wqret")); Lessons4.Add(new Lesson("右手上段 yuiop", "yuiop")); Lessons4.Add(new Lesson("右手上段 poiuy", "poiuy")); Lessons4.Add(new Lesson("右手上段 yuiopoiuy", "yuiopoiuy")); Lessons4.Add(new Lesson("右手上段 yupio", "yupio")); Lessons4.Add(new Lesson("右手上段 ipyou", "ipyou")); Lessons4.Add(new Lesson("右手上段 pooyi", "pooyi")); Lessons5.Add(new Lesson("両手上段 qwertyuiop", "qwertyuiop")); Lessons5.Add(new Lesson("両手上段 poiuytrewq", "poiuytrewq")); Lessons6.Add(new Lesson("両手下段 zxcvbnm", "zxcvbnm")); Lessons6.Add(new Lesson("両手下段 mnbvcxz", "mnbvcxz")); Lessons6.Add(new Lesson("両手下段 bxmzvnc", "bxmzvnc")); Lessons6.Add(new Lesson("両手下段 xncmzvb", "xncmzvb")); Lessons7.Add(new Lesson("左手人差し指 trgfbv", "trgfbv")); Lessons7.Add(new Lesson("左手人差し指 vbfgrt", "vbfgrt")); Lessons7.Add(new Lesson("左手人差し指 fbvtrg", "fbvtrg")); Lessons7.Add(new Lesson("左手人差し指 gvrbtf", "gvrbtf")); Lessons7.Add(new Lesson("左手人差し指 btfrgv", "btfrgv")); Lessons7.Add(new Lesson("左手人差し指 yuhjnm", "yuhjnm")); Lessons8.Add(new Lesson("右手人差し指 yuhjnm", "yuhjnm")); Lessons8.Add(new Lesson("右手人差し指 mnhjyu", "mnhjyu")); Lessons8.Add(new Lesson("右手人差し指 huyjnm", "huyjnm")); Lessons8.Add(new Lesson("右手人差し指 jnuhmy", "jnuhmy")); Lessons8.Add(new Lesson("右手人差し指 yhmjnu", "yhmjnu")); Lessons9.Add(new Lesson("両手中指 edcik", "edcik")); Lessons9.Add(new Lesson("両手中指 eicde", "eicde")); Lessons9.Add(new Lesson("両手中指 ckdie", "ckdie")); Lessons9.Add(new Lesson("両手中指 eidkc", "eidkc")); Lessons9.Add(new Lesson("両手中指 ekcid", "ekcid")); Lessons10.Add(new Lesson("両手人差し指+中指 hijikirennji", "hijikirennji")); Lessons10.Add(new Lesson("両手人差し指+中指 gennkidekiru", "gennkidekiru")); Lessons11.Add(new Lesson("左手薬指小指 qwaszx", "qwaszx")); Lessons11.Add(new Lesson("左手薬指小指 xzsawq", "xzsawq")); Lessons11.Add(new Lesson("左手薬指小指 wasxzq", "wasxzq")); Lessons11.Add(new Lesson("左手薬指小指 axqzws", "axqzws")); Lessons11.Add(new Lesson("左手薬指小指 xzaqsw", "xzaqsw")); Lessons12.Add(new Lesson("右手薬指小指 oplpo", "oplpo")); Lessons12.Add(new Lesson("右手薬指小指 plolp", "plolp")); Lessons12.Add(new Lesson("右手薬指小指 lopol", "lopol")); Lessons12.Add(new Lesson("右手薬指小指 olplo", "olplo")); Lessons13.Add(new Lesson("両手薬指小指 aspwol", "aspwol")); Lessons13.Add(new Lesson("両手薬指小指 qxozap", "qxozap")); Lessons13.Add(new Lesson("両手薬指小指 szwlqo", "szwlqo")); Lessons13.Add(new Lesson("両手薬指小指 plaoxz", "plaoxz")); Lessons14.Add(new Lesson("母音 aiueo", "aiueo")); Lessons14.Add(new Lesson("母音 aiuue", "aiuue")); Lessons14.Add(new Lesson("母音 aeiuo", "aeiuo")); Lessons14.Add(new Lesson("母音 aoiue", "aoiue")); Lessons14.Add(new Lesson("母音 oeuia", "oeuia")); Lessons14.Add(new Lesson("母音 oieeu", "oieeu")); // ■は改行 Lessons15.Add(new Lesson("50音", "aiueo■ kakikukeko■ sasisuseso■ tatituteto■ naninuneno■ mamimumemo■ yayuyo■ rarirurero■ wawonn")); Lessons15.Add(new Lesson("記号", ".,!?[]()-~")); Lessons15.Add(new Lesson("数字", "2581736409")); } void InitLessonMenu() { ToolStripMenuItem item1 = new ToolStripMenuItem("左手中段", null); InitLessonMenu0(item1, Lessons1); ToolStripMenuItem item2 = new ToolStripMenuItem("右手中段", null); InitLessonMenu0(item2, Lessons2); ToolStripMenuItem item3 = new ToolStripMenuItem("左手上段", null); InitLessonMenu0(item3, Lessons3); ToolStripMenuItem item4 = new ToolStripMenuItem("右手上段", null); InitLessonMenu0(item4, Lessons4); ToolStripMenuItem item5 = new ToolStripMenuItem("両手上段", null); InitLessonMenu0(item5, Lessons5); ToolStripMenuItem item6 = new ToolStripMenuItem("両手下段", null); InitLessonMenu0(item6, Lessons6); ToolStripMenuItem item7 = new ToolStripMenuItem("左手人差し指", null); InitLessonMenu0(item7, Lessons7); ToolStripMenuItem item8 = new ToolStripMenuItem("右手人差し指", null); InitLessonMenu0(item8, Lessons8); ToolStripMenuItem item9 = new ToolStripMenuItem("両手中指", null); InitLessonMenu0(item9, Lessons9); ToolStripMenuItem item10 = new ToolStripMenuItem("両手人差し指+中指", null); InitLessonMenu0(item10, Lessons10); ToolStripMenuItem item11 = new ToolStripMenuItem("左手薬指小指", null); InitLessonMenu0(item11, Lessons11); ToolStripMenuItem item12 = new ToolStripMenuItem("右手薬指小指", null); InitLessonMenu0(item12, Lessons12); ToolStripMenuItem item13 = new ToolStripMenuItem("両手薬指小指", null); InitLessonMenu0(item13, Lessons13); ToolStripMenuItem item14 = new ToolStripMenuItem("母音", null); InitLessonMenu0(item14, Lessons14); ToolStripMenuItem item15 = new ToolStripMenuItem("50音 記号 数字", null); InitLessonMenu0(item15, Lessons15); ToolStripMenuItem item16 = new ToolStripMenuItem("自分で設定する", null, MySelect_Click); MenuItemSelectCourse.DropDown.Items.Add(item16); } void InitLessonMenu0(ToolStripMenuItem parentItem, List<Lesson> lessons) { MenuItemSelectCourse.DropDown.Items.Add(parentItem); foreach(Lesson lesson in lessons) { ToolStripMenuItem item = new ToolStripMenuItem(lesson.Title, null, DropDownItem_Click); item.Tag = lesson; parentItem.DropDownItems.Add(item); } } } |
次にメニューが選択されたらお題の文字列が表示されるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public partial class Form1 : Form { int curCharIndex = 0; bool isRandom = false; char[] chars = null; private void DropDownItem_Click(object sender, EventArgs e) { ToolStripMenuItem item = (ToolStripMenuItem)sender; Lesson lesson = (Lesson)item.Tag; chars = lesson.Chars; // ランダムに出題することもできるが、ここでは順番は固定である isRandom = false; curCharIndex = 0; ShowNextChar(); } } |
ShowNextChar()はお題の文字列が表示させるためのメソッドです。[ナビ] ⇒ [次のキー]がチェックされている場合、該当するラベルの背景色を赤に変更します。また[ナビ] ⇒ [指]がチェックされている場合、使う指に該当するラベルの背景色をピンク色に変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
public partial class Form1 : Form { void ShowNextChar() { if(chars == null || chars.Length == 0) return; int len = chars.Length; if(curCharIndex >= len) { // ランダムに出題するときはここで順番を入れ替える if(isRandom) chars = GetRandomChars(chars.ToList()).ToArray(); curCharIndex = 0; } char c = chars[curCharIndex]; if(c != '■') labelChar.Text = c.ToString(); else labelChar.Text = "[Enter]"; curCharIndex++; ShowNavi(c); } void ShowNavi(char c) { List<Label> labels = GetAllLabels(); foreach(Label label in labels) { label.BackColor = Color.FromName("Control"); } if(MenuItemShowNext.Checked) { Label label = GetLabelFromChar(c); if(label != null) label.BackColor = Color.Red; } if(MenuItemShowFinger.Checked) { Label label = GetFingerLabelFromChar(c); if(label != null) label.BackColor = Color.Pink; } } List<char> GetRandomChars(List<char> vs) { List<char> ret = new List<char>(); Random random = new Random((int)DateTime.Now.Ticks); while(vs.Count > 0) { int i = random.Next(vs.Count); ret.Add(vs[i]); vs.RemoveAt(i); } return ret; } } |
ラベルの背景色を変更するときはそれまで変更されていたものを元に戻す必要があります。GetAllLabels()はフォーム上のラベルをすべて取得するためのメソッドです。ラベルの背景色を変更するときは、いったんそれまで変更されていたものを元に戻してから処理をしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public partial class Form1 : Form { public List<Label> GetAllLabels() { List<Label> labels = new List<Label>(); foreach(Control c in this.Controls) { if(c.GetType() == typeof(Label)) labels.Add((Label)c); } return labels; } } |
キーに対応したラベルを求めるGetLabelFromChar(char c)メソッドとGetFingerLabelFromChar(char c)メソッドを示します。前者はキーから対応するラベルを、後者はキーから指のラベルを取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
public partial class Form1 : Form { Label GetLabelFromChar(char c) { if(c == '1' || c == '!') return label1; else if(c == '2' || c == '"') return label2; else if(c == '3' || c == '#') return label3; else if(c == '4' || c == '$') return label4; else if(c == '5' || c == '%') return label5; else if(c == '6' || c == '&') return label6; else if(c == '7' || c == '\'') return label7; else if(c == '8' || c == '(') return label8; else if(c == '9' || c == ')') return label9; else if(c == '0') return label0; else if(c == '-' || c == '=') return labelHyphen; else if(c == '^' || c == '~') return labelHat; else if(c == '\\' || c == '|') return labelYen; else if(c == 'q' || c == 'Q') return labelQ; else if(c == 'w' || c == 'W') return labelW; else if(c == 'e' || c == 'E') return labelE; else if(c == 'r' || c == 'R') return labelR; else if(c == 't' || c == 'T') return labelT; else if(c == 'y' || c == 'Y') return labelY; else if(c == 'u' || c == 'U') return labelU; else if(c == 'i' || c == 'I') return labelI; else if(c == 'o' || c == 'O') return labelO; else if(c == 'p' || c == 'P') return labelP; else if(c == '@' || c == '`') return labelAt; else if(c == '[' || c == '{') return labelKakuLeft; else if(c == 'a' || c == 'A') return labelA; else if(c == 's' || c == 'S') return labelS; else if(c == 'd' || c == 'D') return labelD; else if(c == 'f' || c == 'F') return labelF; else if(c == 'g' || c == 'G') return labelG; else if(c == 'h' || c == 'H') return labelH; else if(c == 'j' || c == 'J') return labelJ; else if(c == 'k' || c == 'K') return labelK; else if(c == 'l' || c == 'L') return labelL; else if(c == ';' || c == '+') return labelSemicolon; else if(c == ':' || c == '*') return labelColon; else if(c == ']' || c == '}') return labelKakuRight; else if(c == 'z' || c == 'Z') return labelZ; else if(c == 'x' || c == 'X') return labelX; else if(c == 'c' || c == 'C') return labelC; else if(c == 'v' || c == 'V') return labelV; else if(c == 'b' || c == 'B') return labelB; else if(c == 'n' || c == 'N') return labelN; else if(c == 'm' || c == 'M') return labelM; else if(c == ',' || c == '<') return labelComma; else if(c == '.' || c == '>') return labelPeriod; else if(c == '/' || c == '?') return labelSlash; else if(c == '_') return labelBackSlash; else if(c == ' ') return labelSpace; else if(c == '\r' || c == '■') return labelEnter; else return null; } Label GetFingerLabelFromChar(char c) { if(c == '1' || c == '!' || c == 'q' || c == 'Q' || c == 'a' || c == 'A' || c == 'z' || c == 'Z') { // 左手小指 return labelLeft4; } else if(c == '2' || c == '\'' || c == 'w' || c == 'W' || c == 'x' || c == 'X' || c == 's' || c == 'S') { // 左手薬指 return labelLeft3; } else if(c == '3' || c == '#' || c == 'e' || c == 'E' || c == 'd' || c == 'D' || c == 'c' || c == 'C') { // 左手中指 return labelLeft2; } else if(c == '4' || c == '$' || c == 'r' || c == 'R' || c == 'f' || c == 'F' || c == 'v' || c == 'V' || c == '5' || c == '%' || c == 't' || c == 'T' || c == 'g' || c == 'G' || c == 'b' || c == 'B') { // 左手人差し指 return labelLeft1; } else if(c == '6' || c == '&' || c == 'y' || c == 'Y' || c == 'h' || c == 'H' || c == 'n' || c == 'N' || c == '7' || c == '\'' || c == 'u' || c == 'U' || c == 'j' || c == 'J' || c == 'm' || c == 'M') { // 右手人差し指 return labelRight1; } else if(c == '8' || c == '(' || c == 'i' || c == 'I' || c == 'k' || c == 'K' || c == ',' || c == '<') { // 右手中指 return labelRight2; } else if(c == '9' || c == ')' || c == 'o' || c == 'O' || c == 'l' || c == 'L' || c == '.' || c == '>') { // 右手薬指 return labelRight3; } else if(c == '0' || c == 'p' || c == 'P' || c == ';' || c == '+' || c == '/' || c == '?' || c == '-' || c == '=' || c == '@' || c == '`' || c == ':' || c == '*' || c == '_' || c == '^' || c == '[' || c == ']' || c == '\\' || c == '■') { // 右手小指 return labelRight4; } else if(c == ' ') { // スペースキー return null; } return null; } } |
キーがおされたら正しくキーが押されたかしらべて結果を表示します。そのためのメソッドがJudgePressKey(char char0, char press)です。正しければ”OK!”、まちがっていれば”Miss!”と表示します。間違っている場合は、そのまま次のお題に進むか正しく入力できるまで進めないかを設定できるようにしています。
ShowPressKey(char c)メソッドは実際に押されたキーがどれなのかを表示するものですが、[ナビ] ⇒ [押されたキー]がチェックされていないと表示されません。[ナビ] ⇒ [押されたキー]がチェックされている場合、該当するラベルの背景色をオレンジ色に変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public partial class Form1 : Form { bool Judge = false; protected override void OnKeyPress(KeyPressEventArgs e) { if(labelChar.Text == "") return; if(labelChar.Text == "[Enter]") Judge = JudgePressKey('\r', e.KeyChar); else Judge = JudgePressKey(labelChar.Text[0], e.KeyChar); ShowPressKey(e.KeyChar); if(Judge) { labelJudge.Text = "OK!"; } else { labelJudge.Text = "Miss!"; } } bool JudgePressKey(char char0, char press) { if(char0 == press) return true; else return false; } } |
ShowPressKey(char c)メソッドでは左右のSHIFTキーを区別しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public partial class Form1 : Form { void ShowPressKey(char c) { List<Label> labels = GetAllLabels(); foreach(Label label0 in labels) { if(label0.BackColor == Color.Orange) label0.BackColor = Color.FromName("Control"); } if(MenuItemShowPress.Checked == false) return; Label label = GetLabelFromChar(c); if(label != null) label.BackColor = Color.Orange; if(IsKeyPress(Keys.LShiftKey)) labelLeftShift.BackColor = Color.Orange; if(IsKeyPress(Keys.RShiftKey)) labelRightShift.BackColor = Color.Orange; } } |
ところでSHIFTキーが押されているかどうかは以下のコードで知ることができます。
1 2 |
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) Console.WriteLine("Shiftキーが押されています。"); |
ところが左右のSHIFTキーになると
1 2 |
if ((Control.ModifierKeys & Keys.LShiftKey) == Keys.LShiftKey) Console.WriteLine("左のShiftキーが押されている?"); |
これではうまくいきません。WindowsのC#でキーをリアルタイムに取得する方法 – QiitaによるとWINAPIを使用してキーを取得するしかないようです。そこで以下のようにしています。
1 2 3 4 5 6 7 8 9 10 11 |
public partial class Form1 : Form { [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern short GetKeyState(int nVirtKey); bool IsKeyPress(Keys keyCode) { // GetKeyStateは最上位ビットが1か否かでキー投下の有無を取得できる return GetKeyState((int)keyCode) < 0; } } |
キーが離された場合、正しく入力できていた場合は次に進みます。間違っていた場合は[設定] ⇒ [間違って入力した場合もそのまま続ける]にチェックがされていない場合だけ次に進みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class Form1 : Form { protected override void OnKeyUp(KeyEventArgs e) { // SHIFTキーなどが離されただけで次のお題が表示されるのを防ぐ if(e.KeyCode == Keys.ControlKey || e.KeyCode == Keys.ShiftKey) return; if(Judge || MenuItemContinueWhenMiss.Checked) ShowNextChar(); } private void MenuItemShowNext_Click(object sender, EventArgs e) { if(MenuItemShowNext.Checked) MenuItemShowNext.Checked = false; else MenuItemShowNext.Checked = true; } } |
最後にチェックボックスの状態を変更するイベントハンドラを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public partial class Form1 : Form { private void MenuItemShowPress_Click(object sender, EventArgs e) { if(MenuItemShowPress.Checked) MenuItemShowPress.Checked = false; else MenuItemShowPress.Checked = true; } private void MenuItemShowFinger_Click(object sender, EventArgs e) { if(MenuItemShowFinger.Checked) MenuItemShowFinger.Checked = false; else MenuItemShowFinger.Checked = true; } private void MenuItemContinueWhenMiss_Click(object sender, EventArgs e) { if(MenuItemContinueWhenMiss.Checked) MenuItemContinueWhenMiss.Checked = false; else MenuItemContinueWhenMiss.Checked = true; } } |