Index 扉へ 首頁
人類の品種・宇宙人・系外銀河など
関東のアルファベットでプログラムを書けるツールです (C#)
0   商湯      2026年2月5日 木 10:03
関東のアルファベットでプログラムを書けるツールです
書いたコードをC#のへ変換します

Download source files:
http://www.jkofsp.net/files/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

namespace ShangAlphabet
{
   public partial class Form1 : Form
   {
       enum PhonemeType
       {
           Unknown,
           Tsu_N_Num_Symbol,
           Consonant,
           Aspirate,
           Semivowel,
           Vowel,
       }

       struct KeyInfo
       {
           Keys[] TheKeys;

           public KeyInfo(Keys key0) { TheKeys = new Keys[] { key0, }; }
           public KeyInfo(Keys key0, Keys key1) { TheKeys = new Keys[] { key0, key1, }; }
           public KeyInfo(Keys key0, Keys key1, Keys key2) { TheKeys = new Keys[] { key0, key1, key2, }; }
           public KeyInfo(Keys key0, Keys key1, Keys key2, Keys key3) { TheKeys = new Keys[] { key0, key1, key2, key3, }; }

           public bool CompareWith(IList<Keys> X)
           {
               if (TheKeys == null) return false;

               if (TheKeys.Length != X.Count)
                   return false;
               for (int i = 0; i < TheKeys.Length; i++)
                   if (TheKeys[i] != X[i])
                       return false;
               return true;
           }
           public bool CompareWith(IList<Keys> X0, Keys x1)
           {
               if (TheKeys == null) return false;

               if (TheKeys.Length != X0.Count + 1)
                   return false;
               for (int i = 0; i < X0.Count; i++)
                   if (TheKeys[i] != X0[i])
                       return false;
               if (TheKeys[X0.Count] != x1)
                   return false;
               return true;
           }
       }

       private List<List<ushort>> TextLines;
       private List<List<byte>> TextColor;
       private readonly byte Color_Normal = 0, Color_Keyword = 1, Color_Comment = 2, Color_Abc = 3;
       private int CursorX, CursorDX, CursorY;
       private int ViewX, ViewY;

       List<Bitmap[]> Fonts;

       List<KeyInfo> KeyInfos = new List<KeyInfo>(677);
       List<Keys> InputBuffer = new List<Keys>();

       string CurrentFilePath;

       FormConv TheFormConv = null;

       public Form1()
       {
           InitializeComponent();

           G.SetupKeywords();
           G.SetupSymbols();
           G.SetupChars();

           TextLines = new List<List<ushort>>();
           TextLines.Add(new List<ushort>());
           CursorX = 0;
           CursorDX = 0;
           CursorY = 0;
           ViewX = 0;
           ViewY = 0;
           TextColor = new List<List<byte>>();
           TextColor.Add(null);

           InitKeyInfos();

           CurrentFilePath = "";
       }

       private void Form1_Load(object sender, EventArgs e)
       {
           Fonts = new List<Bitmap[]>();

           Fonts.Add(new Bitmap[677]);
           for (int i = 0; i <= 676; i++)
           {
               Bitmap bmp = (Bitmap)Image.FromFile(@"Characters\" + i.ToString("D3") + ".bmp");
               bmp.MakeTransparent(Color.FromArgb(unchecked((int)0xFFffffff)));
               Fonts[Color_Normal][i] = bmp;
           }

           Fonts.Add(new Bitmap[677]);
           for (int i = 0; i <= 676; i++)
           {
               Bitmap bmp = new Bitmap(Fonts[Color_Normal][i]);
               ChangeColor(bmp, 0xFF, 0, 0, 0, 0xFF, Color.Blue.R, Color.Blue.G, Color.Blue.B);
               bmp.MakeTransparent(Color.FromArgb(unchecked((int)0xFFffffff)));
               Fonts[Color_Keyword][i] = bmp;
           }

           Fonts.Add(new Bitmap[677]);
           for (int i = 0; i <= 676; i++)
           {
               Bitmap bmp = new Bitmap(Fonts[Color_Normal][i]);
               ChangeColor(bmp, 0xFF, 0, 0, 0, 0xFF, Color.Green.R, Color.Green.G, Color.Green.B);
               bmp.MakeTransparent(Color.FromArgb(unchecked((int)0xFFffffff)));
               Fonts[Color_Comment][i] = bmp;
           }

           Fonts.Add(new Bitmap[677]);
           for (int i = 0; i <= 676; i++)
           {
               Bitmap bmp = new Bitmap(Fonts[Color_Normal][i]);
               ChangeColor(bmp, 0xFF, 0, 0, 0, 0xFF, Color.Aqua.R, Color.Aqua.G, Color.Aqua.B);
               bmp.MakeTransparent(Color.FromArgb(unchecked((int)0xFFffffff)));
               Fonts[Color_Abc][i] = bmp;
           }
       }

       public void LoadText(List<ushort> text)
       {
           TextLines = new List<List<ushort>>();

           TextLines.Add(new List<ushort>());
           foreach (ushort i in text)
               if (i == 583 /*583==enter*/)
                   TextLines.Add(new List<ushort>());
               else
                   TextLines[TextLines.Count - 1].Add(i);

           CursorX = 0;
           CursorDX = 0;
           CursorY = 0;
           ViewX = 0;
           ViewY = 0;

           VScroll.Maximum = TextLines.Count - 1;

           TextColor = new List<List<byte>>();
           for (int i = 0; i < TextLines.Count; i++)
               TextColor.Add(null);
           for (int i = 0; i < TextLines.Count; i++)
               Highlight(i);

           CheckScroll();

           View.Refresh();
       }

       public List<ushort> GetText()
       {
           List<ushort> text = new List<ushort>();
           text.AddRange(TextLines[0]);
           for (int i = 1; i < TextLines.Count; i++)
           {
               text.Add(583 /*583==enter*/);
               text.AddRange(TextLines[i]);
           }

           return text;
       }

       public void InsertChar(ushort ch)
       {
           List<ushort> tmp;
           tmp = TextLines[CursorY].GetRange(0, CursorX);
           tmp.Add(ch);
           tmp.AddRange(TextLines[CursorY].GetRange(CursorX, TextLines[CursorY].Count - CursorX));
           TextLines[CursorY] = tmp;
           
           CursorX += 1;

           Highlight(CursorY);

           CheckScroll();

           View.Refresh();
       }

       public void ReplaceChar(ushort ch)
       {
           if (CursorX == 0)
               return;

           List<ushort> tmp;
           tmp = TextLines[CursorY].GetRange(0, CursorX - 1);
           tmp.Add(ch);
           tmp.AddRange(TextLines[CursorY].GetRange(CursorX, TextLines[CursorY].Count - CursorX));
           TextLines[CursorY] = tmp;

           //CheckScroll();

           Highlight(CursorY);

           View.Refresh();
       }

       public void DeleteChar()
       {
           if (CursorX == 0)
               return;

           List<ushort> tmp;
           tmp = TextLines[CursorY].GetRange(0, CursorX - 1);
           tmp.AddRange(TextLines[CursorY].GetRange(CursorX, TextLines[CursorY].Count - CursorX));
           TextLines[CursorY] = tmp;
           
           CursorX -= 1;

           Highlight(CursorY);

           CheckScroll();

           View.Refresh();
       }

       private void View_Paint(object sender, PaintEventArgs e)
       {
           Render(e.Graphics);
       }

       private void Render(Graphics g)
       {
           if (CursorDX < 0)
               g.FillRectangle(Brushes.Aqua, (CursorX + CursorDX - ViewX) * 31 + 1, (CursorY - ViewY) * 35, -CursorDX * 31, 35);
           else if (CursorDX > 0)
               g.FillRectangle(Brushes.Aqua, (CursorX - ViewX) * 31 + 1, (CursorY - ViewY) * 35, CursorDX * 31, 35);

           for (int i = ViewY; i < Math.Min(ViewY + View.Height / 35, TextLines.Count); i++)
               for (int j = ViewX; j < Math.Min(ViewX + View.Width / 31, TextLines[i].Count); j++)
                   if (TextLines[i][j] != 582 /*582==space*/)
                   {
                       Bitmap tmp = Fonts[TextColor[i][j]][TextLines[i][j]];
                       g.DrawImage(tmp, (j - ViewX) * 31 + 1, (i - ViewY) * 35);
                   }

           g.DrawLine(Pens.Black, (CursorX - ViewX) * 31 + 1, (CursorY - ViewY) * 35, (CursorX - ViewX) * 31 + 1, (CursorY - ViewY) * 35 + 35);
       }

       private bool MapKeyword(List<ushort> ident)
       {
           foreach (List<ushort> i in G.Keywords.Keys)
               if (G.Cmp(i, ident))
                   return true;

           return false;
       }

       private Tuple<byte, int> Lexer(List<ushort> l, ref int i)
       {
           byte color = Color_Normal;
           int len = 0;
           List<ushort> ident = new List<ushort>();

       _0:
           if (i >= l.Count) { color = Color_Normal; return new Tuple<byte, int>(color, len); }
           else if (l[i] == G.Untr0("♪")) { len++; i++; goto _Comment; }
           else if (l[i] == G.Untr0("`")) { len++; i++; goto _Abc; }
           else if (l[i] >= G.Untr0("a") && l[i] <= G.Untr0("rwo")) { ident.Add(l[i]); len++; i++; goto _Ident; }
           else { len++; i++; goto _1; }
       _1:
           if (i >= l.Count) { color = Color_Normal; return new Tuple<byte, int>(color, len); }
           else if (l[i] == G.Untr0("♪")) { color = Color_Normal; return new Tuple<byte, int>(color, len); }
           else if (l[i] == G.Untr0("`")) { color = Color_Normal; return new Tuple<byte, int>(color, len); }
           else if (l[i] >= G.Untr0("a") && l[i] <= G.Untr0("rwo")) { color = Color_Normal; return new Tuple<byte, int>(color, len); }
           else { len++; i++; goto _1; }
       _Comment:
           if (i >= l.Count) { color = Color_Comment; i++; return new Tuple<byte, int>(color, len); }
           else { len++; i++; goto _Comment; };
       _Abc:
           if (i >= l.Count) { color = Color_Abc; return new Tuple<byte, int>(color, len); }
           else if (l[i] >= G.Untr0("a") && l[i] <= G.Untr0("rwo")) { len++; i++; goto _Abc; }
           else { color = Color_Abc; return new Tuple<byte, int>(color, len); }
       _Ident:
           if (i >= l.Count) { color = MapKeyword(ident) ? Color_Keyword : Color_Normal; return new Tuple<byte, int>(color, len); }
           else if (l[i] >= 0 && l[i] <= G.Untr0("rwo")) { ident.Add(l[i]); len++; i++; goto _Ident; }
           else { color = MapKeyword(ident) ? Color_Keyword : Color_Normal; return new Tuple<byte, int>(color, len); }
       }

       private void Highlight(int lineIndex)
       {
           TextColor[lineIndex] = new List<byte>();
           int i = 0;
           while (i < TextLines[lineIndex].Count)
           {
               Tuple<byte, int> t = Lexer(TextLines[lineIndex], ref i);
               for (int j = 0; j < t.Item2; j++)
                   TextColor[lineIndex].Add(t.Item1);
           }
       }

       private void MenuSetTextColor_Click(object sender, EventArgs e)
       {
           List<ushort> _sha = GetText();

           string _op = "";
           G.Conv(_sha, ref _op);

           TheFormConv = new FormConv();
           TheFormConv.textBox1.Text = _op;
           TheFormConv.Show();
       }

       private void CheckScroll()
       {
           if (CursorY < ViewY)
               VScroll.Value = CursorY;
           //if (CursorY > ViewY + View.Height / 35 - 1)
           //    VScroll.Value = CursorY - View.Height / 35 + 1;
           if (CursorY > ViewY + View.Height / 35 - 1)
               VScroll.Value = CursorY - View.Height / 35 + 1;
           if (CursorX < ViewX + 1)
               HScroll.Value = Math.Max(CursorX - 1, 0);
           if (CursorX > ViewX + View.Width / 31)
               HScroll.Value = Math.Min(HScroll.Maximum, CursorX - View.Width / 31);
       }

       private void View_MouseClick(object sender, MouseEventArgs e)
       {
           InputBuffer.Clear();

           Focus();

           CursorY = ViewY + e.Y / 35;
           if (CursorY >= TextLines.Count)
               CursorY = TextLines.Count - 1;
           CursorX = ViewX + e.X / 31;
           if (CursorX >= TextLines[CursorY].Count)
               CursorX = TextLines[CursorY].Count;
           CursorDX = 0;

           CheckScroll();

           View.Refresh();

           Text = '(' + CursorY.ToString() +')';
       }

       private void View_Resize(object sender, EventArgs e)
       {
           try
           {
               VScroll.Maximum = TextLines.Count - 1;
           }
           catch (Exception) { }

           View.Refresh();
       }

       private void VScroll_ValueChanged(object sender, EventArgs e)
       {
           ViewY = VScroll.Value;

           View.Refresh();
       }

       private void HScroll_ValueChanged(object sender, EventArgs e)
       {
           ViewX = HScroll.Value;

           View.Refresh();
       }

       protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
       {
           if (keyData == Keys.Up)
           {
               InputBuffer.Clear();

               CursorY--;
               if (CursorY < 0)
                   CursorY = 0;
               if (CursorX > TextLines[CursorY].Count)
                   CursorX = TextLines[CursorY].Count;
               CursorDX = 0;

               CheckScroll();

               View.Refresh();

               return true;
           }
           else if (keyData == Keys.Down)
           {
               InputBuffer.Clear();

               CursorY++;
               if (CursorY >= TextLines.Count)
                   CursorY = TextLines.Count - 1;
               if (CursorX > TextLines[CursorY].Count)
                   CursorX = TextLines[CursorY].Count;
               CursorDX = 0;

               CheckScroll();

               View.Refresh();

               return true;
           }
           else if (keyData == Keys.Left)
           {
               InputBuffer.Clear();

               CursorX--;
               if (CursorX < 0)
                   CursorX = 0;
               CursorDX = 0;

               CheckScroll();

               View.Refresh();

               return true;
           }
           else if (keyData == Keys.Right)
           {
               InputBuffer.Clear();

               CursorX++;
               if (CursorX > TextLines[CursorY].Count)
                   CursorX = TextLines[CursorY].Count;
               CursorDX = 0;

               CheckScroll();

               View.Refresh();

               return true;
           }
           else if (keyData == (Keys.Left | Keys.Shift))
           {
               InputBuffer.Clear();

               CursorX--;
               if (CursorX < 0)
                   CursorX = 0;
               else
                   CursorDX++;

               CheckScroll();

               View.Refresh();

               return true;
           }
           else if (keyData == (Keys.Right | Keys.Shift))
           {
               InputBuffer.Clear();

               CursorX++;
               if (CursorX > TextLines[CursorY].Count)
                   CursorX = TextLines[CursorY].Count;
               else
                   CursorDX--;

               CheckScroll();

               View.Refresh();

               return true;
           }
           else if (keyData == Keys.Home)
           {
               int tmp = 0;
               for (tmp = 0; tmp < TextLines[CursorY].Count; tmp++)
                   if (TextLines[CursorY][tmp] != G.Untr0("space"))
                       break;
               CursorX = tmp;
               CursorDX = 0;

               CheckScroll();

               View.Refresh();

               return true;
           }
           else if (keyData == Keys.End)
           {
               CursorX = TextLines[CursorY].Count;
               CursorDX = 0;

               CheckScroll();

               View.Refresh();

               return true;
           }
           else
           {
               return base.ProcessCmdKey(ref msg, keyData);
           }
       }

       private void Form1_KeyDown(object sender, KeyEventArgs e)
       {
           if (e.KeyData == Keys.Back)
           {
               if (InputBuffer.Count == 0)
               {
                   if (CursorDX == 0)
                   {
                       if (CursorX == 0)
                       {
                           if (CursorY > 0)
                           {
                               CursorX = TextLines[CursorY - 1].Count;
                               TextLines[CursorY - 1].AddRange(TextLines[CursorY]);
                               TextLines.RemoveAt(CursorY);
                               TextColor.RemoveAt(CursorY);
                               CursorY -= 1;

                               VScroll.Maximum = TextLines.Count - 1;

                               Highlight(CursorY);
                           }
                       }
                       else
                       {
                           List<ushort> tmp;
                           tmp = TextLines[CursorY].GetRange(0, CursorX - 1);
                           tmp.AddRange(TextLines[CursorY].GetRange(CursorX, TextLines[CursorY].Count - CursorX));
                           TextLines[CursorY] = tmp;
                           CursorX -= 1;

                           Highlight(CursorY);
                       }
                   }
                   else
                   {
                       if (CursorDX < 0)
                       {
                           List<ushort> tmp;
                           tmp = TextLines[CursorY].GetRange(0, CursorX + CursorDX);
                           tmp.AddRange(TextLines[CursorY].GetRange(CursorX, TextLines[CursorY].Count - CursorX));
                           TextLines[CursorY] = tmp;
                           CursorX += CursorDX;
                       }
                       else
                       {
                           List<ushort> tmp;
                           tmp = TextLines[CursorY].GetRange(0, CursorX);
                           tmp.AddRange(TextLines[CursorY].GetRange(CursorX + CursorDX, TextLines[CursorY].Count - CursorX - CursorDX));
                           TextLines[CursorY] = tmp;
                       }
                       CursorDX = 0;

                       Highlight(CursorY);
                   }
               }
               else // InputBuffer.Count > 0
               {
                   InputBuffer.Clear();

                   DeleteChar();

                   Highlight(CursorY);
               }
           }
           else if (e.KeyData == Keys.Enter)
           {
               InputBuffer.Clear();

               List<ushort> newLine = TextLines[CursorY].GetRange(CursorX, TextLines[CursorY].Count - CursorX);
               TextLines[CursorY] = TextLines[CursorY].GetRange(0, CursorX);
               List<ushort> space = new List<ushort>();
               for (int i = 0; i < TextLines[CursorY].Count; i++)
                   if (TextLines[CursorY][i] == G.Untr0("space"))
                   {
                       space.Add(G.Untr0("space"));
                       continue;
                   }
                   else
                   {
                       break;
                   }
               List<ushort> spaceAndNewLine = new List<ushort>(space);
               spaceAndNewLine.AddRange(newLine);
               TextLines.Insert(CursorY + 1, spaceAndNewLine);
               TextColor.Insert(CursorY + 1, null);
               CursorY += 1;
               CursorX = space.Count;
               CursorDX = 0;

               VScroll.Maximum = TextLines.Count - 1;

               Highlight(CursorY - 1);
               Highlight(CursorY);
           }
           else
           {
               if (CursorDX != 0)
                   return;

               PhonemeType phType = GetPhonemeType(e.KeyData);

               if (phType == PhonemeType.Unknown)
               {
                   return;
               }
               else if (phType == PhonemeType.Tsu_N_Num_Symbol)
               {
                   InputBuffer.Clear();

                   InsertChar((ushort)KeyInfos.FindIndex(x => x.CompareWith(new Keys[] { e.KeyData })));
               }
               else if (phType == PhonemeType.Consonant)
               {
                   InputBuffer.Clear();

                   InputBuffer.Add(e.KeyData);

                   InsertChar((ushort)KeyInfos.FindIndex(x => x.CompareWith(InputBuffer)));
               }
               else if (phType == PhonemeType.Aspirate)
               {
                   int tmp = KeyInfos.FindIndex(x => x.CompareWith(InputBuffer, e.KeyData));
                   if (tmp >= 0)
                   {
                       InputBuffer.Add(e.KeyData);

                       ReplaceChar((ushort)tmp);
                   }
               }
               else if (phType == PhonemeType.Semivowel)
               {
                   int tmp = KeyInfos.FindIndex(x => x.CompareWith(InputBuffer, e.KeyData));
                   if (tmp >= 0)
                   {
                       InputBuffer.Add(e.KeyData);

                       ReplaceChar((ushort)tmp);
                   }
               }
               else if (phType == PhonemeType.Vowel)
               {
                   int tmp = KeyInfos.FindIndex(x => x.CompareWith(InputBuffer, e.KeyData));
                   if (tmp >= 0)
                   {
                       ReplaceChar((ushort)tmp);

                       InputBuffer.Clear();
                   }
               }

               Highlight(CursorY);
           }

           CheckScroll();

           View.Refresh();
       }

       private void MenuNew_Click(object sender, EventArgs e)
       {
           if (MessageBox.Show("本当に新規作成をしますか?", "新規作成?", MessageBoxButtons.OKCancel) == DialogResult.OK)
           {
               LoadText(new List<ushort>());

               CurrentFilePath = "";
           }
       }

       private void MenuOpen_Click(object sender, EventArgs e)
       {
           if (OpenDlg.ShowDialog() == DialogResult.OK)
           {
               Stream stream = OpenDlg.OpenFile();
               BinaryReader r = new BinaryReader(stream);
               List<ushort> text = new List<ushort>();
               while (stream.Position < stream.Length)
                   text.Add(r.ReadUInt16());
               r.Close();

               LoadText(text);

               CurrentFilePath = OpenDlg.FileName;
           }
       }

       private void MenuSave_Click(object sender, EventArgs e)
       {
           if (CurrentFilePath == "")
               MenuSaveAs_Click(sender, e);
           else
               Save(CurrentFilePath);
       }

       private void MenuSaveAs_Click(object sender, EventArgs e)
       {
           if (SaveDlg.ShowDialog() == DialogResult.OK)
           {
               Save(SaveDlg.FileName);

               CurrentFilePath = SaveDlg.FileName;
           }
       }

       private void MenuClose_Click(object sender, EventArgs e)
       {
           Close();
       }

       private void Form1_FormClosing(object sender, FormClosingEventArgs e)
       {
           if (TextLines.Count == 1 && TextLines[0].Count == 0)
               return;

           if (MessageBox.Show("本当に終了しますか?", "終了?", MessageBoxButtons.OKCancel) != DialogResult.OK)
               e.Cancel = true;
       }

       private void Save(string filePath)
       {
           Stream stream = new FileStream(filePath, FileMode.Create);
           BinaryWriter w = new BinaryWriter(stream);
           List<ushort> text = GetText();
           foreach (ushort i in text)
               w.Write((UInt16)i);
           w.Close();
       }

       private PhonemeType GetPhonemeType(Keys key)
       {
           switch (key)
           {
               case Keys.D0:
                   return PhonemeType.Tsu_N_Num_Symbol;
               case Keys.D1:
                   return PhonemeType.Tsu_N_Num_Symbol;
               case Keys.D2:
                   return PhonemeType.Tsu_N_Num_Symbol;
               case Keys.D3:
                   return PhonemeType.Tsu_N_Num_Symbol;
               case Keys.D4:
                   return PhonemeType.Tsu_N_Num_Symbol;
               case Keys.D5:
                   return PhonemeType.Tsu_N_Num_Symbol;
               case Keys.D6:
                   return PhonemeType.Tsu_N_Num_Symbol;
               case Keys.D7:
                   return PhonemeType.Tsu_N_Num_Symbol;
               case Keys.D8:
                   return PhonemeType.Tsu_N_Num_Symbol;
               case Keys.D9:
                   return PhonemeType.Tsu_N_Num_Symbol;

               case Keys.I:
                   return PhonemeType.Vowel;
               case Keys.V:
                   return PhonemeType.Vowel;
               case Keys.U:
                   return PhonemeType.Vowel;
               case Keys.E:
                   return PhonemeType.Vowel;
               case Keys.O:
                   return PhonemeType.Vowel;

               case Keys.Y:
                   return PhonemeType.Semivowel;
               case Keys.W:
                   return PhonemeType.Semivowel;

               case Keys.OemPeriod: // . Q
                   return PhonemeType.Tsu_N_Num_Symbol;
               case Keys.Oemplus: // ; N
                   return PhonemeType.Tsu_N_Num_Symbol;

               case Keys.Oemtilde: // `
                   return PhonemeType.Aspirate;

               case Keys.A:
                   return PhonemeType.Consonant;
               case Keys.H:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.H:
                   return PhonemeType.Consonant;

               case Keys.Shift | Keys.Q:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.J:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.D1:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.D2:
                   return PhonemeType.Consonant;

               case Keys.K:
                   return PhonemeType.Consonant;
               case Keys.G:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.K:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.G:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.N:
                   return PhonemeType.Consonant;

               case Keys.Shift | Keys.C:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.Z:
                   return PhonemeType.Consonant;
               case Keys.Oemcomma: // , hca
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.Oemcomma: // , hja
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.Oemplus: // ; jna
                   return PhonemeType.Consonant;

               case Keys.S:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.S:
                   return PhonemeType.Consonant;
               case Keys.X:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.X:
                   return PhonemeType.Consonant;

               case Keys.T:
                   return PhonemeType.Consonant;
               case Keys.D:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.T:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.D:
                   return PhonemeType.Consonant;
               case Keys.N:
                   return PhonemeType.Consonant;
               case Keys.L:
                   return PhonemeType.Consonant;

               case Keys.C:
                   return PhonemeType.Consonant;
               case Keys.Z:
                   return PhonemeType.Consonant;
               case Keys.Q:
                   return PhonemeType.Consonant;
               case Keys.J:
                   return PhonemeType.Consonant;

               case Keys.P:
                   return PhonemeType.Consonant;
               case Keys.B:
                   return PhonemeType.Consonant;
               case Keys.F:
                   return PhonemeType.Consonant;
               case Keys.M:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.F:
                   return PhonemeType.Consonant;
               case Keys.Shift | Keys.V:
                   return PhonemeType.Consonant;

               case Keys.R:
                   return PhonemeType.Consonant;

               case Keys.Space:

               case Keys.OemBackslash: // _ 。
               case Keys.OemQuestion: // / 、
               case Keys.OemSemicolon: // : :
               case Keys.Shift | Keys.OemSemicolon: // : ;
               case Keys.Shift | Keys.OemQuestion: // / ?
               case Keys.Shift | Keys.OemBackslash: // _ !
               case Keys.Control | Keys.Shift | Keys.OemPipe: // | …

               case Keys.Control | Keys.Shift | Keys.Oemtilde: // ` @
               case Keys.Shift | Keys.D3: // #
               case Keys.Control | Keys.D6: // &
               case Keys.Shift | Keys.D5: // %
               case Keys.OemPipe: // | |
               case Keys.Control | Keys.Oemtilde: // ` `

               case Keys.Shift | Keys.D8: // (
               case Keys.Shift | Keys.D9: // )
               case Keys.Shift | Keys.OemOpenBrackets: // [ {
               case Keys.Shift | Keys.OemCloseBrackets: // ] }
               case Keys.OemOpenBrackets: // [ [
               case Keys.OemCloseBrackets: // ] ]
               case Keys.Control | Keys.OemOpenBrackets: // [ 「
               case Keys.Control | Keys.OemCloseBrackets: // ] 」
               case Keys.Control | Keys.Shift | Keys.OemOpenBrackets: // [ 『
               case Keys.Control | Keys.Shift | Keys.OemCloseBrackets: // ] 』
               case Keys.Control | Keys.Shift | Keys.D8: // 【
               case Keys.Control | Keys.Shift | Keys.D9: // 】

               case Keys.Shift | Keys.D4: //  °
               case Keys.Shift | Keys.D0: // ∞
               case Keys.Control | Keys.D0: // ∝
               case Keys.Control | Keys.Shift | Keys.D2: // ※
               case Keys.Control | Keys.D2: // *
               case Keys.Control | Keys.D7: // ★
               case Keys.Shift | Keys.D7: // ☆
               case Keys.Control | Keys.M: // ♪

               case Keys.Control | Keys.Oemplus: // ; +
               case Keys.OemMinus: // - -
               case Keys.Control | Keys.Shift | Keys.Oemplus: // ; ±
               case Keys.Control | Keys.OemMinus: // - _
               case Keys.Control | Keys.OemSemicolon: // : ×
               case Keys.Control | Keys.Shift | Keys.OemSemicolon: // : ・
               case Keys.Control | Keys.OemQuestion: // / ÷
               case Keys.Control | Keys.Shift | Keys.OemQuestion: // / /
               case Keys.Control | Keys.Shift | Keys.OemBackslash: // _ \
               case Keys.OemQuotes: // ^ ^
               case Keys.Control | Keys.OemQuotes: // ^ √
               case Keys.Control | Keys.D4:// (+)
               case Keys.Control | Keys.Shift | Keys.D4: // (×)

               case Keys.Shift | Keys.OemMinus: // - =
               case Keys.Control | Keys.Shift | Keys.OemMinus: // - ≠
               case Keys.Control | Keys.G: // ≒
               case Keys.Control | Keys.F: // ---
               case Keys.Control | Keys.Oemcomma: // , <
               case Keys.Control | Keys.H: // ≪
               case Keys.Control | Keys.Shift | Keys.Oemcomma: // , ≦
               case Keys.Control | Keys.OemPeriod: // . >
               case Keys.Control | Keys.J: // ≫
               case Keys.Control | Keys.Shift | Keys.OemPeriod: // . ≧

               case Keys.Control | Keys.D1: // ¬
               case Keys.Shift | Keys.OemPipe: // | ∨
               case Keys.Shift | Keys.D6: // ∧
               case Keys.Shift | Keys.OemQuotes: // ^ ~
               case Keys.Control | Keys.K: // ∵
               case Keys.Control | Keys.L: // ∴
               case Keys.Shift | Keys.A: // ∀
               case Keys.Shift | Keys.E: // ∃

               case Keys.Control | Keys.Q: // ∈
               case Keys.Control | Keys.Shift | Keys.Q: // ∈/
               case Keys.Control | Keys.E: // ∋
               case Keys.Control | Keys.Shift | Keys.E: // ∋\
               case Keys.Control | Keys.R: // ⊂
               case Keys.Control | Keys.Shift | Keys.R: // ⊆
               case Keys.Control | Keys.T:// ⊃
               case Keys.Control | Keys.Shift | Keys.T: // ⊇
               case Keys.Control | Keys.U: // ∪
               case Keys.Control | Keys.Y: // ∩
               case Keys.Control | Keys.O: // Φ

               case Keys.Control | Keys.D: // →
               case Keys.Control | Keys.A: // ←
               case Keys.Control | Keys.W: // ↑
               case Keys.Control | Keys.S: // ↓
               case Keys.Control | Keys.Shift | Keys.D: // ⇒
               case Keys.Control | Keys.Shift | Keys.A: // <=
               case Keys.Control | Keys.Shift | Keys.S: // ⇔

               case Keys.Control | Keys.Z: // Δ
               case Keys.Control | Keys.Shift | Keys.Z: // ∇
               case Keys.Control | Keys.X: // ∑
               case Keys.Control | Keys.Shift | Keys.X: // Π
               case Keys.Control | Keys.C: // d
               case Keys.Control | Keys.Shift | Keys.C: // ∂
               case Keys.Control | Keys.V: // ∫
               case Keys.Control | Keys.Shift | Keys.V: // ∮
               case Keys.Control | Keys.B: // ∬
               case Keys.Control | Keys.Shift | Keys.B: // ∬○
               case Keys.Control | Keys.N: // ∫∫∫
                   return PhonemeType.Tsu_N_Num_Symbol;
           }

           return PhonemeType.Unknown;
       }

1   商湯      2026年2月5日 木 10:03
       private void InitKeyInfos()
       {
           for (int i = 0; i <= 676; i++)
               KeyInfos.Add(new KeyInfo());

           KeyInfos[0] = new KeyInfo(Keys.D0); // 0
           KeyInfos[1] = new KeyInfo(Keys.D1);
           KeyInfos[2] = new KeyInfo(Keys.D2);
           KeyInfos[3] = new KeyInfo(Keys.D3);
           KeyInfos[4] = new KeyInfo(Keys.D4);
           KeyInfos[5] = new KeyInfo(Keys.D5);
           KeyInfos[6] = new KeyInfo(Keys.D6);
           KeyInfos[7] = new KeyInfo(Keys.D7);
           KeyInfos[8] = new KeyInfo(Keys.D8);
           KeyInfos[9] = new KeyInfo(Keys.D9);

           KeyInfos[10] = new KeyInfo(Keys.A); // a
           KeyInfos[11] = new KeyInfo(Keys.A, Keys.I);
           KeyInfos[12] = new KeyInfo(Keys.A, Keys.V);
           KeyInfos[13] = new KeyInfo(Keys.A, Keys.U);
           KeyInfos[14] = new KeyInfo(Keys.A, Keys.E);
           KeyInfos[15] = new KeyInfo(Keys.A, Keys.O);

           KeyInfos[16] = new KeyInfo(Keys.A, Keys.Y); // ya
           KeyInfos[17] = new KeyInfo(Keys.A, Keys.Y, Keys.U);
           KeyInfos[18] = new KeyInfo(Keys.A, Keys.Y, Keys.E);
           KeyInfos[19] = new KeyInfo(Keys.A, Keys.Y, Keys.O);

           KeyInfos[20] = new KeyInfo(Keys.A, Keys.W); // wa
           KeyInfos[21] = new KeyInfo(Keys.A, Keys.W, Keys.I);
           KeyInfos[22] = new KeyInfo(Keys.A, Keys.W, Keys.E);
           KeyInfos[23] = new KeyInfo(Keys.A, Keys.W, Keys.O);

           KeyInfos[24] = new KeyInfo(Keys.H); // ha
           KeyInfos[25] = new KeyInfo(Keys.H, Keys.I);
           KeyInfos[26] = new KeyInfo(Keys.H, Keys.V);
           KeyInfos[27] = new KeyInfo(Keys.H, Keys.U);
           KeyInfos[28] = new KeyInfo(Keys.H, Keys.E);
           KeyInfos[29] = new KeyInfo(Keys.H, Keys.O);

           KeyInfos[30] = new KeyInfo(Keys.H, Keys.Y); // hya
           KeyInfos[31] = new KeyInfo(Keys.H, Keys.Y, Keys.U);
           KeyInfos[32] = new KeyInfo(Keys.H, Keys.Y, Keys.E);
           KeyInfos[33] = new KeyInfo(Keys.H, Keys.Y, Keys.O);

           KeyInfos[34] = new KeyInfo(Keys.H, Keys.W); // hwa
           KeyInfos[35] = new KeyInfo(Keys.H, Keys.W, Keys.I);
           KeyInfos[36] = new KeyInfo(Keys.H, Keys.W, Keys.E);
           KeyInfos[37] = new KeyInfo(Keys.H, Keys.W, Keys.O);

           KeyInfos[38] = new KeyInfo(Keys.Shift | Keys.H); // Ha
           KeyInfos[39] = new KeyInfo(Keys.Shift | Keys.H, Keys.I);
           KeyInfos[40] = new KeyInfo(Keys.Shift | Keys.H, Keys.V);
           KeyInfos[41] = new KeyInfo(Keys.Shift | Keys.H, Keys.U);
           KeyInfos[42] = new KeyInfo(Keys.Shift | Keys.H, Keys.E);
           KeyInfos[43] = new KeyInfo(Keys.Shift | Keys.H, Keys.O);

           KeyInfos[44] = new KeyInfo(Keys.Shift | Keys.H, Keys.Y); // Hya
           KeyInfos[45] = new KeyInfo(Keys.Shift | Keys.H, Keys.Y, Keys.U);
           KeyInfos[46] = new KeyInfo(Keys.Shift | Keys.H, Keys.Y, Keys.E);
           KeyInfos[47] = new KeyInfo(Keys.Shift | Keys.H, Keys.Y, Keys.O);

           KeyInfos[48] = new KeyInfo(Keys.Shift | Keys.H, Keys.W); // Hwa
           KeyInfos[49] = new KeyInfo(Keys.Shift | Keys.H, Keys.W, Keys.I);
           KeyInfos[50] = new KeyInfo(Keys.Shift | Keys.H, Keys.W, Keys.E);
           KeyInfos[51] = new KeyInfo(Keys.Shift | Keys.H, Keys.W, Keys.O);

           KeyInfos[52] = new KeyInfo(Keys.OemPeriod); // . Q

           KeyInfos[53] = new KeyInfo(Keys.Shift | Keys.Q); // qa
           KeyInfos[54] = new KeyInfo(Keys.Shift | Keys.Q, Keys.I);
           KeyInfos[55] = new KeyInfo(Keys.Shift | Keys.Q, Keys.V);
           KeyInfos[56] = new KeyInfo(Keys.Shift | Keys.Q, Keys.U);
           KeyInfos[57] = new KeyInfo(Keys.Shift | Keys.Q, Keys.E);
           KeyInfos[58] = new KeyInfo(Keys.Shift | Keys.Q, Keys.O);
           
           KeyInfos[59] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Y); // qya
           KeyInfos[60] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Y, Keys.U);
           KeyInfos[61] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Y, Keys.E);
           KeyInfos[62] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Y, Keys.O);

           KeyInfos[63] = new KeyInfo(Keys.Shift | Keys.Q, Keys.W); // qwa
           KeyInfos[64] = new KeyInfo(Keys.Shift | Keys.Q, Keys.W, Keys.I);
           KeyInfos[65] = new KeyInfo(Keys.Shift | Keys.Q, Keys.W, Keys.E);
           KeyInfos[66] = new KeyInfo(Keys.Shift | Keys.Q, Keys.W, Keys.O);

           KeyInfos[67] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde); // qha
           KeyInfos[68] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.I);
           KeyInfos[69] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.V);
           KeyInfos[70] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.U);
           KeyInfos[71] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.E);
           KeyInfos[72] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.O);

           KeyInfos[73] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.Y); // qhya
           KeyInfos[74] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.Y, Keys.U);
           KeyInfos[75] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.Y, Keys.E);
           KeyInfos[76] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.Y, Keys.O);

           KeyInfos[77] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.W); // qhwa
           KeyInfos[78] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.W, Keys.I);
           KeyInfos[79] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.W, Keys.E);
           KeyInfos[80] = new KeyInfo(Keys.Shift | Keys.Q, Keys.Oemtilde, Keys.W, Keys.O);

           KeyInfos[81] = new KeyInfo(Keys.Shift | Keys.J); // Ga
           KeyInfos[82] = new KeyInfo(Keys.Shift | Keys.J, Keys.I);
           KeyInfos[83] = new KeyInfo(Keys.Shift | Keys.J, Keys.V);
           KeyInfos[84] = new KeyInfo(Keys.Shift | Keys.J, Keys.U);
           KeyInfos[85] = new KeyInfo(Keys.Shift | Keys.J, Keys.E);
           KeyInfos[86] = new KeyInfo(Keys.Shift | Keys.J, Keys.O);

           KeyInfos[87] = new KeyInfo(Keys.Shift | Keys.J, Keys.Y); // Gya
           KeyInfos[88] = new KeyInfo(Keys.Shift | Keys.J, Keys.Y, Keys.U);
           KeyInfos[89] = new KeyInfo(Keys.Shift | Keys.J, Keys.Y, Keys.E);
           KeyInfos[90] = new KeyInfo(Keys.Shift | Keys.J, Keys.Y, Keys.O);

           KeyInfos[91] = new KeyInfo(Keys.Shift | Keys.J, Keys.W); // Gwa
           KeyInfos[92] = new KeyInfo(Keys.Shift | Keys.J, Keys.W, Keys.I);
           KeyInfos[93] = new KeyInfo(Keys.Shift | Keys.J, Keys.W, Keys.E);
           KeyInfos[94] = new KeyInfo(Keys.Shift | Keys.J, Keys.W, Keys.O);

           KeyInfos[95] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde); // Gha
           KeyInfos[96] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.I);
           KeyInfos[97] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.V);
           KeyInfos[98] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.U);
           KeyInfos[99] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.E);
           KeyInfos[100] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.O);

2   商湯      2026年2月5日 木 10:04
           KeyInfos[101] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.Y); // Gya
           KeyInfos[102] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.Y, Keys.U);
           KeyInfos[103] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.Y, Keys.E);
           KeyInfos[104] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.Y, Keys.O);

           KeyInfos[105] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.W); // Gwa
           KeyInfos[106] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.W, Keys.I);
           KeyInfos[107] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.W, Keys.E);
           KeyInfos[108] = new KeyInfo(Keys.Shift | Keys.J, Keys.Oemtilde, Keys.W, Keys.O);

           KeyInfos[109] = new KeyInfo(Keys.Shift | Keys.D1); // xha
           KeyInfos[110] = new KeyInfo(Keys.Shift | Keys.D1, Keys.I);
           KeyInfos[111] = new KeyInfo(Keys.Shift | Keys.D1, Keys.V);
           KeyInfos[112] = new KeyInfo(Keys.Shift | Keys.D1, Keys.U);
           KeyInfos[113] = new KeyInfo(Keys.Shift | Keys.D1, Keys.E);
           KeyInfos[114] = new KeyInfo(Keys.Shift | Keys.D1, Keys.O);

           KeyInfos[115] = new KeyInfo(Keys.Shift | Keys.D1, Keys.Y); // xhya
           KeyInfos[116] = new KeyInfo(Keys.Shift | Keys.D1, Keys.Y, Keys.U);
           KeyInfos[117] = new KeyInfo(Keys.Shift | Keys.D1, Keys.Y, Keys.E);
           KeyInfos[118] = new KeyInfo(Keys.Shift | Keys.D1, Keys.Y, Keys.O);

           KeyInfos[119] = new KeyInfo(Keys.Shift | Keys.D1, Keys.W); // xhwa
           KeyInfos[120] = new KeyInfo(Keys.Shift | Keys.D1, Keys.W, Keys.I);
           KeyInfos[121] = new KeyInfo(Keys.Shift | Keys.D1, Keys.W, Keys.E);
           KeyInfos[122] = new KeyInfo(Keys.Shift | Keys.D1, Keys.W, Keys.O);

           KeyInfos[123] = new KeyInfo(Keys.Shift | Keys.D2); // Xha
           KeyInfos[124] = new KeyInfo(Keys.Shift | Keys.D2, Keys.I);
           KeyInfos[125] = new KeyInfo(Keys.Shift | Keys.D2, Keys.V);
           KeyInfos[126] = new KeyInfo(Keys.Shift | Keys.D2, Keys.U);
           KeyInfos[127] = new KeyInfo(Keys.Shift | Keys.D2, Keys.E);
           KeyInfos[128] = new KeyInfo(Keys.Shift | Keys.D2, Keys.O);

           KeyInfos[129] = new KeyInfo(Keys.Shift | Keys.D2, Keys.Y); // Xhya
           KeyInfos[130] = new KeyInfo(Keys.Shift | Keys.D2, Keys.Y, Keys.U);
           KeyInfos[131] = new KeyInfo(Keys.Shift | Keys.D2, Keys.Y, Keys.E);
           KeyInfos[132] = new KeyInfo(Keys.Shift | Keys.D2, Keys.Y, Keys.O);

           KeyInfos[133] = new KeyInfo(Keys.Shift | Keys.D2, Keys.W); // Xhwa
           KeyInfos[134] = new KeyInfo(Keys.Shift | Keys.D2, Keys.W, Keys.I);
           KeyInfos[135] = new KeyInfo(Keys.Shift | Keys.D2, Keys.W, Keys.E);
           KeyInfos[136] = new KeyInfo(Keys.Shift | Keys.D2, Keys.W, Keys.O);

           KeyInfos[137] = new KeyInfo(Keys.Oemplus); // ; N

           KeyInfos[138] = new KeyInfo(Keys.K); // ka
           KeyInfos[139] = new KeyInfo(Keys.K, Keys.I);
           KeyInfos[140] = new KeyInfo(Keys.K, Keys.V);
           KeyInfos[141] = new KeyInfo(Keys.K, Keys.U);
           KeyInfos[142] = new KeyInfo(Keys.K, Keys.E);
           KeyInfos[143] = new KeyInfo(Keys.K, Keys.O);

           KeyInfos[144] = new KeyInfo(Keys.K, Keys.Y); // kya
           KeyInfos[145] = new KeyInfo(Keys.K, Keys.Y, Keys.U);
           KeyInfos[146] = new KeyInfo(Keys.K, Keys.Y, Keys.E);
           KeyInfos[147] = new KeyInfo(Keys.K, Keys.Y, Keys.O);

           KeyInfos[148] = new KeyInfo(Keys.K, Keys.W); // kwa
           KeyInfos[149] = new KeyInfo(Keys.K, Keys.W, Keys.I);
           KeyInfos[150] = new KeyInfo(Keys.K, Keys.W, Keys.E);
           KeyInfos[151] = new KeyInfo(Keys.K, Keys.W, Keys.O);

           KeyInfos[152] = new KeyInfo(Keys.K, Keys.Oemtilde); // kha
           KeyInfos[153] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.I);
           KeyInfos[154] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.V);
           KeyInfos[155] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.U);
           KeyInfos[156] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.E);
           KeyInfos[157] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.O);

           KeyInfos[158] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.Y); // khya
           KeyInfos[159] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.Y, Keys.U);
           KeyInfos[160] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.Y, Keys.E);
           KeyInfos[161] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.Y, Keys.O);

           KeyInfos[162] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.W); // khwa
           KeyInfos[163] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.W, Keys.I);
           KeyInfos[164] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.W, Keys.E);
           KeyInfos[165] = new KeyInfo(Keys.K, Keys.Oemtilde, Keys.W, Keys.O);

           KeyInfos[166] = new KeyInfo(Keys.G); // ga
           KeyInfos[167] = new KeyInfo(Keys.G, Keys.I);
           KeyInfos[168] = new KeyInfo(Keys.G, Keys.V);
           KeyInfos[169] = new KeyInfo(Keys.G, Keys.U);
           KeyInfos[170] = new KeyInfo(Keys.G, Keys.E);
           KeyInfos[171] = new KeyInfo(Keys.G, Keys.O);

           KeyInfos[172] = new KeyInfo(Keys.G, Keys.Y); // gya
           KeyInfos[173] = new KeyInfo(Keys.G, Keys.Y, Keys.U);
           KeyInfos[174] = new KeyInfo(Keys.G, Keys.Y, Keys.E);
           KeyInfos[175] = new KeyInfo(Keys.G, Keys.Y, Keys.O);

           KeyInfos[176] = new KeyInfo(Keys.G, Keys.W); // gwa
           KeyInfos[177] = new KeyInfo(Keys.G, Keys.W, Keys.I);
           KeyInfos[178] = new KeyInfo(Keys.G, Keys.W, Keys.E);
           KeyInfos[179] = new KeyInfo(Keys.G, Keys.W, Keys.O);

           KeyInfos[180] = new KeyInfo(Keys.G, Keys.Oemtilde); // gha
           KeyInfos[181] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.I);
           KeyInfos[182] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.V);
           KeyInfos[183] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.U);
           KeyInfos[184] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.E);
           KeyInfos[185] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.O);

           KeyInfos[186] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.Y); // ghya
           KeyInfos[187] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.Y, Keys.U);
           KeyInfos[188] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.Y, Keys.E);
           KeyInfos[189] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.Y, Keys.O);

           KeyInfos[190] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.W); // ghwa
           KeyInfos[191] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.W, Keys.I);
           KeyInfos[192] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.W, Keys.E);
           KeyInfos[193] = new KeyInfo(Keys.G, Keys.Oemtilde, Keys.W, Keys.O);

           KeyInfos[194] = new KeyInfo(Keys.Shift | Keys.K); // xa
           KeyInfos[195] = new KeyInfo(Keys.Shift | Keys.K, Keys.I);
           KeyInfos[196] = new KeyInfo(Keys.Shift | Keys.K, Keys.V);
           KeyInfos[197] = new KeyInfo(Keys.Shift | Keys.K, Keys.U);
           KeyInfos[198] = new KeyInfo(Keys.Shift | Keys.K, Keys.E);
           KeyInfos[199] = new KeyInfo(Keys.Shift | Keys.K, Keys.O);

3   商湯      2026年2月5日 木 10:04
           KeyInfos[200] = new KeyInfo(Keys.Shift | Keys.K, Keys.Y); // xya
           KeyInfos[201] = new KeyInfo(Keys.Shift | Keys.K, Keys.Y, Keys.U);
           KeyInfos[202] = new KeyInfo(Keys.Shift | Keys.K, Keys.Y, Keys.E);
           KeyInfos[203] = new KeyInfo(Keys.Shift | Keys.K, Keys.Y, Keys.O);

           KeyInfos[204] = new KeyInfo(Keys.Shift | Keys.K, Keys.W); // xwa
           KeyInfos[205] = new KeyInfo(Keys.Shift | Keys.K, Keys.W, Keys.I);
           KeyInfos[206] = new KeyInfo(Keys.Shift | Keys.K, Keys.W, Keys.E);
           KeyInfos[207] = new KeyInfo(Keys.Shift | Keys.K, Keys.W, Keys.O);

           KeyInfos[208] = new KeyInfo(Keys.Shift | Keys.G); // Xa
           KeyInfos[209] = new KeyInfo(Keys.Shift | Keys.G, Keys.I);
           KeyInfos[210] = new KeyInfo(Keys.Shift | Keys.G, Keys.V);
           KeyInfos[211] = new KeyInfo(Keys.Shift | Keys.G, Keys.U);
           KeyInfos[212] = new KeyInfo(Keys.Shift | Keys.G, Keys.E);
           KeyInfos[213] = new KeyInfo(Keys.Shift | Keys.G, Keys.O);

           KeyInfos[214] = new KeyInfo(Keys.Shift | Keys.G, Keys.Y); // xya
           KeyInfos[215] = new KeyInfo(Keys.Shift | Keys.G, Keys.Y, Keys.U);
           KeyInfos[216] = new KeyInfo(Keys.Shift | Keys.G, Keys.Y, Keys.E);
           KeyInfos[217] = new KeyInfo(Keys.Shift | Keys.G, Keys.Y, Keys.O);

           KeyInfos[218] = new KeyInfo(Keys.Shift | Keys.G, Keys.W); // xwa
           KeyInfos[219] = new KeyInfo(Keys.Shift | Keys.G, Keys.W, Keys.I);
           KeyInfos[220] = new KeyInfo(Keys.Shift | Keys.G, Keys.W, Keys.E);
           KeyInfos[221] = new KeyInfo(Keys.Shift | Keys.G, Keys.W, Keys.O);

           KeyInfos[222] = new KeyInfo(Keys.Shift | Keys.N); // nga
           KeyInfos[223] = new KeyInfo(Keys.Shift | Keys.N, Keys.I);
           KeyInfos[224] = new KeyInfo(Keys.Shift | Keys.N, Keys.V);
           KeyInfos[225] = new KeyInfo(Keys.Shift | Keys.N, Keys.U);
           KeyInfos[226] = new KeyInfo(Keys.Shift | Keys.N, Keys.E);
           KeyInfos[227] = new KeyInfo(Keys.Shift | Keys.N, Keys.O);

           KeyInfos[228] = new KeyInfo(Keys.Shift | Keys.N, Keys.Y); // ngya
           KeyInfos[229] = new KeyInfo(Keys.Shift | Keys.N, Keys.Y, Keys.U);
           KeyInfos[230] = new KeyInfo(Keys.Shift | Keys.N, Keys.Y, Keys.E);
           KeyInfos[231] = new KeyInfo(Keys.Shift | Keys.N, Keys.Y, Keys.O);

           KeyInfos[232] = new KeyInfo(Keys.Shift | Keys.N, Keys.W); // ngwa
           KeyInfos[233] = new KeyInfo(Keys.Shift | Keys.N, Keys.W, Keys.I);
           KeyInfos[234] = new KeyInfo(Keys.Shift | Keys.N, Keys.W, Keys.E);
           KeyInfos[235] = new KeyInfo(Keys.Shift | Keys.N, Keys.W, Keys.O);

           KeyInfos[236] = new KeyInfo(Keys.Shift | Keys.C); // ca
           KeyInfos[237] = new KeyInfo(Keys.Shift | Keys.C, Keys.I);
           KeyInfos[238] = new KeyInfo(Keys.Shift | Keys.C, Keys.U);
           KeyInfos[239] = new KeyInfo(Keys.Shift | Keys.C, Keys.E);
           KeyInfos[240] = new KeyInfo(Keys.Shift | Keys.C, Keys.O);

           KeyInfos[241] = new KeyInfo(Keys.Shift | Keys.C, Keys.Oemtilde); // cha
           KeyInfos[242] = new KeyInfo(Keys.Shift | Keys.C, Keys.Oemtilde, Keys.I);
           KeyInfos[243] = new KeyInfo(Keys.Shift | Keys.C, Keys.Oemtilde, Keys.U);
           KeyInfos[244] = new KeyInfo(Keys.Shift | Keys.C, Keys.Oemtilde, Keys.E);
           KeyInfos[245] = new KeyInfo(Keys.Shift | Keys.C, Keys.Oemtilde, Keys.O);

           KeyInfos[246] = new KeyInfo(Keys.Shift | Keys.Z); // ja
           KeyInfos[247] = new KeyInfo(Keys.Shift | Keys.Z, Keys.I);
           KeyInfos[248] = new KeyInfo(Keys.Shift | Keys.Z, Keys.U);
           KeyInfos[249] = new KeyInfo(Keys.Shift | Keys.Z, Keys.E);
           KeyInfos[250] = new KeyInfo(Keys.Shift | Keys.Z, Keys.O);

           KeyInfos[251] = new KeyInfo(Keys.Shift | Keys.Z, Keys.Oemtilde); // jha
           KeyInfos[252] = new KeyInfo(Keys.Shift | Keys.Z, Keys.Oemtilde, Keys.I);
           KeyInfos[253] = new KeyInfo(Keys.Shift | Keys.Z, Keys.Oemtilde, Keys.U);
           KeyInfos[254] = new KeyInfo(Keys.Shift | Keys.Z, Keys.Oemtilde, Keys.E);
           KeyInfos[255] = new KeyInfo(Keys.Shift | Keys.Z, Keys.Oemtilde, Keys.O);

           KeyInfos[256] = new KeyInfo(Keys.Oemcomma); // , hca
           KeyInfos[257] = new KeyInfo(Keys.Oemcomma, Keys.I);
           KeyInfos[258] = new KeyInfo(Keys.Oemcomma, Keys.U);
           KeyInfos[259] = new KeyInfo(Keys.Oemcomma, Keys.E);
           KeyInfos[260] = new KeyInfo(Keys.Oemcomma, Keys.O);

           KeyInfos[261] = new KeyInfo(Keys.Shift | Keys.Oemcomma); // , hja
           KeyInfos[262] = new KeyInfo(Keys.Shift | Keys.Oemcomma, Keys.I);
           KeyInfos[263] = new KeyInfo(Keys.Shift | Keys.Oemcomma, Keys.U);
           KeyInfos[264] = new KeyInfo(Keys.Shift | Keys.Oemcomma, Keys.E);
           KeyInfos[265] = new KeyInfo(Keys.Shift | Keys.Oemcomma, Keys.O);

           KeyInfos[266] = new KeyInfo(Keys.Shift | Keys.Oemplus); // ; jna
           KeyInfos[267] = new KeyInfo(Keys.Shift | Keys.Oemplus, Keys.I);
           KeyInfos[268] = new KeyInfo(Keys.Shift | Keys.Oemplus, Keys.U);
           KeyInfos[269] = new KeyInfo(Keys.Shift | Keys.Oemplus, Keys.E);
           KeyInfos[270] = new KeyInfo(Keys.Shift | Keys.Oemplus, Keys.O);

           KeyInfos[271] = new KeyInfo(Keys.S); // sa
           KeyInfos[272] = new KeyInfo(Keys.S, Keys.I);
           KeyInfos[273] = new KeyInfo(Keys.S, Keys.V);
           KeyInfos[274] = new KeyInfo(Keys.S, Keys.U);
           KeyInfos[275] = new KeyInfo(Keys.S, Keys.E);
           KeyInfos[276] = new KeyInfo(Keys.S, Keys.O);

           KeyInfos[277] = new KeyInfo(Keys.S, Keys.Y); // sya
           KeyInfos[278] = new KeyInfo(Keys.S, Keys.Y, Keys.U);
           KeyInfos[279] = new KeyInfo(Keys.S, Keys.Y, Keys.E);
           KeyInfos[280] = new KeyInfo(Keys.S, Keys.Y, Keys.O);

           KeyInfos[281] = new KeyInfo(Keys.S, Keys.W); // swa
           KeyInfos[282] = new KeyInfo(Keys.S, Keys.W, Keys.I);
           KeyInfos[283] = new KeyInfo(Keys.S, Keys.W, Keys.E);
           KeyInfos[284] = new KeyInfo(Keys.S, Keys.W, Keys.O);

           KeyInfos[285] = new KeyInfo(Keys.Shift | Keys.S); // za
           KeyInfos[286] = new KeyInfo(Keys.Shift | Keys.S, Keys.I);
           KeyInfos[287] = new KeyInfo(Keys.Shift | Keys.S, Keys.V);
           KeyInfos[288] = new KeyInfo(Keys.Shift | Keys.S, Keys.U);
           KeyInfos[289] = new KeyInfo(Keys.Shift | Keys.S, Keys.E);
           KeyInfos[290] = new KeyInfo(Keys.Shift | Keys.S, Keys.O);

           KeyInfos[291] = new KeyInfo(Keys.Shift | Keys.S, Keys.Y); // zya
           KeyInfos[292] = new KeyInfo(Keys.Shift | Keys.S, Keys.Y, Keys.U);
           KeyInfos[293] = new KeyInfo(Keys.Shift | Keys.S, Keys.Y, Keys.E);
           KeyInfos[294] = new KeyInfo(Keys.Shift | Keys.S, Keys.Y, Keys.O);

           KeyInfos[295] = new KeyInfo(Keys.Shift | Keys.S, Keys.W); // zwa
           KeyInfos[296] = new KeyInfo(Keys.Shift | Keys.S, Keys.W, Keys.I);
           KeyInfos[297] = new KeyInfo(Keys.Shift | Keys.S, Keys.W, Keys.E);
           KeyInfos[298] = new KeyInfo(Keys.Shift | Keys.S, Keys.W, Keys.O);

4   商湯      2026年2月5日 木 10:05
           KeyInfos[299] = new KeyInfo(Keys.X); // sha
           KeyInfos[300] = new KeyInfo(Keys.X, Keys.I);
           KeyInfos[301] = new KeyInfo(Keys.X, Keys.U);
           KeyInfos[302] = new KeyInfo(Keys.X, Keys.E);
           KeyInfos[303] = new KeyInfo(Keys.X, Keys.O);

           KeyInfos[304] = new KeyInfo(Keys.Shift | Keys.X); // zha
           KeyInfos[305] = new KeyInfo(Keys.Shift | Keys.X, Keys.I);
           KeyInfos[306] = new KeyInfo(Keys.Shift | Keys.X, Keys.U);
           KeyInfos[307] = new KeyInfo(Keys.Shift | Keys.X, Keys.E);
           KeyInfos[308] = new KeyInfo(Keys.Shift | Keys.X, Keys.O);

           KeyInfos[309] = new KeyInfo(Keys.T); // ta
           KeyInfos[310] = new KeyInfo(Keys.T, Keys.I);
           KeyInfos[311] = new KeyInfo(Keys.T, Keys.V);
           KeyInfos[312] = new KeyInfo(Keys.T, Keys.U);
           KeyInfos[313] = new KeyInfo(Keys.T, Keys.E);
           KeyInfos[314] = new KeyInfo(Keys.T, Keys.O);

           KeyInfos[315] = new KeyInfo(Keys.T, Keys.Y); // tya
           KeyInfos[316] = new KeyInfo(Keys.T, Keys.Y, Keys.U);
           KeyInfos[317] = new KeyInfo(Keys.T, Keys.Y, Keys.E);
           KeyInfos[318] = new KeyInfo(Keys.T, Keys.Y, Keys.O);

           KeyInfos[319] = new KeyInfo(Keys.T, Keys.W); // twa
           KeyInfos[320] = new KeyInfo(Keys.T, Keys.W, Keys.I);
           KeyInfos[321] = new KeyInfo(Keys.T, Keys.W, Keys.E);
           KeyInfos[322] = new KeyInfo(Keys.T, Keys.W, Keys.O);

           KeyInfos[323] = new KeyInfo(Keys.T, Keys.Oemtilde); // tha
           KeyInfos[324] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.I);
           KeyInfos[325] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.V);
           KeyInfos[326] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.U);
           KeyInfos[327] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.E);
           KeyInfos[328] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.O);

           KeyInfos[329] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.Y); // thya
           KeyInfos[330] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.Y, Keys.U);
           KeyInfos[331] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.Y, Keys.E);
           KeyInfos[332] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.Y, Keys.O);

           KeyInfos[333] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.W); // thwa
           KeyInfos[334] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.W, Keys.I);
           KeyInfos[335] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.W, Keys.E);
           KeyInfos[336] = new KeyInfo(Keys.T, Keys.Oemtilde, Keys.W, Keys.O);

           KeyInfos[337] = new KeyInfo(Keys.D); // da
           KeyInfos[338] = new KeyInfo(Keys.D, Keys.I);
           KeyInfos[339] = new KeyInfo(Keys.D, Keys.V);
           KeyInfos[340] = new KeyInfo(Keys.D, Keys.U);
           KeyInfos[341] = new KeyInfo(Keys.D, Keys.E);
           KeyInfos[342] = new KeyInfo(Keys.D, Keys.O);

           KeyInfos[343] = new KeyInfo(Keys.D, Keys.Y); // dya
           KeyInfos[344] = new KeyInfo(Keys.D, Keys.Y, Keys.U);
           KeyInfos[345] = new KeyInfo(Keys.D, Keys.Y, Keys.E);
           KeyInfos[346] = new KeyInfo(Keys.D, Keys.Y, Keys.O);

           KeyInfos[347] = new KeyInfo(Keys.D, Keys.W); // dwa
           KeyInfos[348] = new KeyInfo(Keys.D, Keys.W, Keys.I);
           KeyInfos[349] = new KeyInfo(Keys.D, Keys.W, Keys.E);
           KeyInfos[350] = new KeyInfo(Keys.D, Keys.W, Keys.O);

           KeyInfos[351] = new KeyInfo(Keys.D, Keys.Oemtilde); // dha
           KeyInfos[352] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.I);
           KeyInfos[353] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.V);
           KeyInfos[354] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.U);
           KeyInfos[355] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.E);
           KeyInfos[356] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.O);

           KeyInfos[357] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.Y); // dhya
           KeyInfos[358] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.Y, Keys.U);
           KeyInfos[359] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.Y, Keys.E);
           KeyInfos[360] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.Y, Keys.O);

           KeyInfos[361] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.W); // dhwa
           KeyInfos[362] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.W, Keys.I);
           KeyInfos[363] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.W, Keys.E);
           KeyInfos[364] = new KeyInfo(Keys.D, Keys.Oemtilde, Keys.W, Keys.O);

           KeyInfos[365] = new KeyInfo(Keys.Shift | Keys.T); // hta
           KeyInfos[366] = new KeyInfo(Keys.Shift | Keys.T, Keys.I);
           KeyInfos[367] = new KeyInfo(Keys.Shift | Keys.T, Keys.V);
           KeyInfos[368] = new KeyInfo(Keys.Shift | Keys.T, Keys.U);
           KeyInfos[369] = new KeyInfo(Keys.Shift | Keys.T, Keys.E);
           KeyInfos[370] = new KeyInfo(Keys.Shift | Keys.T, Keys.O);

           KeyInfos[371] = new KeyInfo(Keys.Shift | Keys.T, Keys.Y); // htya
           KeyInfos[372] = new KeyInfo(Keys.Shift | Keys.T, Keys.Y, Keys.U);
           KeyInfos[373] = new KeyInfo(Keys.Shift | Keys.T, Keys.Y, Keys.E);
           KeyInfos[374] = new KeyInfo(Keys.Shift | Keys.T, Keys.Y, Keys.O);

           KeyInfos[375] = new KeyInfo(Keys.Shift | Keys.T, Keys.W); // htwa
           KeyInfos[376] = new KeyInfo(Keys.Shift | Keys.T, Keys.W, Keys.I);
           KeyInfos[377] = new KeyInfo(Keys.Shift | Keys.T, Keys.W, Keys.E);
           KeyInfos[378] = new KeyInfo(Keys.Shift | Keys.T, Keys.W, Keys.O);

           KeyInfos[379] = new KeyInfo(Keys.Shift | Keys.D); // hda
           KeyInfos[380] = new KeyInfo(Keys.Shift | Keys.D, Keys.I);
           KeyInfos[381] = new KeyInfo(Keys.Shift | Keys.D, Keys.V);
           KeyInfos[382] = new KeyInfo(Keys.Shift | Keys.D, Keys.U);
           KeyInfos[383] = new KeyInfo(Keys.Shift | Keys.D, Keys.E);
           KeyInfos[384] = new KeyInfo(Keys.Shift | Keys.D, Keys.O);

           KeyInfos[385] = new KeyInfo(Keys.Shift | Keys.D, Keys.Y); // hdya
           KeyInfos[386] = new KeyInfo(Keys.Shift | Keys.D, Keys.Y, Keys.U);
           KeyInfos[387] = new KeyInfo(Keys.Shift | Keys.D, Keys.Y, Keys.E);
           KeyInfos[388] = new KeyInfo(Keys.Shift | Keys.D, Keys.Y, Keys.O);

           KeyInfos[389] = new KeyInfo(Keys.Shift | Keys.D, Keys.W); // hdwa
           KeyInfos[390] = new KeyInfo(Keys.Shift | Keys.D, Keys.W, Keys.I);
           KeyInfos[391] = new KeyInfo(Keys.Shift | Keys.D, Keys.W, Keys.E);
           KeyInfos[392] = new KeyInfo(Keys.Shift | Keys.D, Keys.W, Keys.O);

           KeyInfos[393] = new KeyInfo(Keys.N); // na
           KeyInfos[394] = new KeyInfo(Keys.N, Keys.I);
           KeyInfos[395] = new KeyInfo(Keys.N, Keys.V);
           KeyInfos[396] = new KeyInfo(Keys.N, Keys.U);
           KeyInfos[397] = new KeyInfo(Keys.N, Keys.E);
           KeyInfos[398] = new KeyInfo(Keys.N, Keys.O);

5   商湯      2026年2月5日 木 10:05
           KeyInfos[399] = new KeyInfo(Keys.N, Keys.Y); // nya
           KeyInfos[400] = new KeyInfo(Keys.N, Keys.Y, Keys.U);
           KeyInfos[401] = new KeyInfo(Keys.N, Keys.Y, Keys.E);
           KeyInfos[402] = new KeyInfo(Keys.N, Keys.Y, Keys.O);

           KeyInfos[403] = new KeyInfo(Keys.N, Keys.W); // nwa
           KeyInfos[404] = new KeyInfo(Keys.N, Keys.W, Keys.I);
           KeyInfos[405] = new KeyInfo(Keys.N, Keys.W, Keys.E);
           KeyInfos[406] = new KeyInfo(Keys.N, Keys.W, Keys.O);

           KeyInfos[407] = new KeyInfo(Keys.L); // nja
           KeyInfos[408] = new KeyInfo(Keys.L, Keys.I);
           KeyInfos[409] = new KeyInfo(Keys.L, Keys.U);
           KeyInfos[410] = new KeyInfo(Keys.L, Keys.E);
           KeyInfos[411] = new KeyInfo(Keys.L, Keys.O);

           KeyInfos[412] = new KeyInfo(Keys.C); // tsa
           KeyInfos[413] = new KeyInfo(Keys.C, Keys.I);
           KeyInfos[414] = new KeyInfo(Keys.C, Keys.V);
           KeyInfos[415] = new KeyInfo(Keys.C, Keys.U);
           KeyInfos[416] = new KeyInfo(Keys.C, Keys.E);
           KeyInfos[417] = new KeyInfo(Keys.C, Keys.O);

           KeyInfos[418] = new KeyInfo(Keys.C, Keys.Y); // tsya
           KeyInfos[419] = new KeyInfo(Keys.C, Keys.Y, Keys.U);
           KeyInfos[420] = new KeyInfo(Keys.C, Keys.Y, Keys.E);
           KeyInfos[421] = new KeyInfo(Keys.C, Keys.Y, Keys.O);

           KeyInfos[422] = new KeyInfo(Keys.C, Keys.W); // tswa
           KeyInfos[423] = new KeyInfo(Keys.C, Keys.W, Keys.I);
           KeyInfos[424] = new KeyInfo(Keys.C, Keys.W, Keys.E);
           KeyInfos[425] = new KeyInfo(Keys.C, Keys.W, Keys.O);

           KeyInfos[426] = new KeyInfo(Keys.C, Keys.Oemtilde); // tsha
           KeyInfos[427] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.I);
           KeyInfos[428] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.V);
           KeyInfos[429] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.U);
           KeyInfos[430] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.E);
           KeyInfos[431] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.O);

           KeyInfos[432] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.Y); // tshya
           KeyInfos[433] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.Y, Keys.U);
           KeyInfos[434] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.Y, Keys.E);
           KeyInfos[435] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.Y, Keys.O);

           KeyInfos[436] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.W); // tshwa
           KeyInfos[437] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.W, Keys.I);
           KeyInfos[438] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.W, Keys.E);
           KeyInfos[439] = new KeyInfo(Keys.C, Keys.Oemtilde, Keys.W, Keys.O);

           KeyInfos[440] = new KeyInfo(Keys.Z); // dza
           KeyInfos[441] = new KeyInfo(Keys.Z, Keys.I);
           KeyInfos[442] = new KeyInfo(Keys.Z, Keys.V);
           KeyInfos[443] = new KeyInfo(Keys.Z, Keys.U);
           KeyInfos[444] = new KeyInfo(Keys.Z, Keys.E);
           KeyInfos[445] = new KeyInfo(Keys.Z, Keys.O);

           KeyInfos[446] = new KeyInfo(Keys.Z, Keys.Y); // dsya
           KeyInfos[447] = new KeyInfo(Keys.Z, Keys.Y, Keys.U);
           KeyInfos[448] = new KeyInfo(Keys.Z, Keys.Y, Keys.E);
           KeyInfos[449] = new KeyInfo(Keys.Z, Keys.Y, Keys.O);

           KeyInfos[450] = new KeyInfo(Keys.Z, Keys.W); // dswa
           KeyInfos[451] = new KeyInfo(Keys.Z, Keys.W, Keys.I);
           KeyInfos[452] = new KeyInfo(Keys.Z, Keys.W, Keys.E);
           KeyInfos[453] = new KeyInfo(Keys.Z, Keys.W, Keys.O);

           KeyInfos[454] = new KeyInfo(Keys.Z, Keys.Oemtilde); // dsha
           KeyInfos[455] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.I);
           KeyInfos[456] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.V);
           KeyInfos[457] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.U);
           KeyInfos[458] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.E);
           KeyInfos[459] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.O);

           KeyInfos[460] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.Y); // dshya
           KeyInfos[461] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.Y, Keys.U);
           KeyInfos[462] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.Y, Keys.E);
           KeyInfos[463] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.Y, Keys.O);

           KeyInfos[464] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.W); // dshwa
           KeyInfos[465] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.W, Keys.I);
           KeyInfos[466] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.W, Keys.E);
           KeyInfos[467] = new KeyInfo(Keys.Z, Keys.Oemtilde, Keys.W, Keys.O);

           KeyInfos[468] = new KeyInfo(Keys.Q); // tsja
           KeyInfos[469] = new KeyInfo(Keys.Q, Keys.I);
           KeyInfos[470] = new KeyInfo(Keys.Q, Keys.U);
           KeyInfos[471] = new KeyInfo(Keys.Q, Keys.E);
           KeyInfos[472] = new KeyInfo(Keys.Q, Keys.O);

           KeyInfos[473] = new KeyInfo(Keys.Q, Keys.Oemtilde); // tsjha
           KeyInfos[474] = new KeyInfo(Keys.Q, Keys.Oemtilde, Keys.I);
           KeyInfos[475] = new KeyInfo(Keys.Q, Keys.Oemtilde, Keys.U);
           KeyInfos[476] = new KeyInfo(Keys.Q, Keys.Oemtilde, Keys.E);
           KeyInfos[477] = new KeyInfo(Keys.Q, Keys.Oemtilde, Keys.O);

           KeyInfos[478] = new KeyInfo(Keys.J); // dzja
           KeyInfos[479] = new KeyInfo(Keys.J, Keys.I);
           KeyInfos[480] = new KeyInfo(Keys.J, Keys.U);
           KeyInfos[481] = new KeyInfo(Keys.J, Keys.E);
           KeyInfos[482] = new KeyInfo(Keys.J, Keys.O);

           KeyInfos[483] = new KeyInfo(Keys.J, Keys.Oemtilde); // dsjha
           KeyInfos[484] = new KeyInfo(Keys.J, Keys.Oemtilde, Keys.I);
           KeyInfos[485] = new KeyInfo(Keys.J, Keys.Oemtilde, Keys.U);
           KeyInfos[486] = new KeyInfo(Keys.J, Keys.Oemtilde, Keys.E);
           KeyInfos[487] = new KeyInfo(Keys.J, Keys.Oemtilde, Keys.O);

           KeyInfos[488] = new KeyInfo(Keys.P); // pa
           KeyInfos[489] = new KeyInfo(Keys.P, Keys.I);
           KeyInfos[490] = new KeyInfo(Keys.P, Keys.V);
           KeyInfos[491] = new KeyInfo(Keys.P, Keys.U);
           KeyInfos[492] = new KeyInfo(Keys.P, Keys.E);
           KeyInfos[493] = new KeyInfo(Keys.P, Keys.O);

           KeyInfos[494] = new KeyInfo(Keys.P, Keys.Y); // pya
           KeyInfos[495] = new KeyInfo(Keys.P, Keys.Y, Keys.U);
           KeyInfos[496] = new KeyInfo(Keys.P, Keys.Y, Keys.E);
           KeyInfos[497] = new KeyInfo(Keys.P, Keys.Y, Keys.O);

6   商湯      2026年2月5日 木 10:06
           KeyInfos[498] = new KeyInfo(Keys.P, Keys.Oemtilde); // pha
           KeyInfos[499] = new KeyInfo(Keys.P, Keys.Oemtilde, Keys.I);
           KeyInfos[500] = new KeyInfo(Keys.P, Keys.Oemtilde, Keys.V);
           KeyInfos[501] = new KeyInfo(Keys.P, Keys.Oemtilde, Keys.U);
           KeyInfos[502] = new KeyInfo(Keys.P, Keys.Oemtilde, Keys.E);
           KeyInfos[503] = new KeyInfo(Keys.P, Keys.Oemtilde, Keys.O);

           KeyInfos[504] = new KeyInfo(Keys.P, Keys.Oemtilde, Keys.Y); // phya
           KeyInfos[505] = new KeyInfo(Keys.P, Keys.Oemtilde, Keys.Y, Keys.U);
           KeyInfos[506] = new KeyInfo(Keys.P, Keys.Oemtilde, Keys.Y, Keys.E);
           KeyInfos[507] = new KeyInfo(Keys.P, Keys.Oemtilde, Keys.Y, Keys.O);

           KeyInfos[508] = new KeyInfo(Keys.B); // ba
           KeyInfos[509] = new KeyInfo(Keys.B, Keys.I);
           KeyInfos[510] = new KeyInfo(Keys.B, Keys.V);
           KeyInfos[511] = new KeyInfo(Keys.B, Keys.U);
           KeyInfos[512] = new KeyInfo(Keys.B, Keys.E);
           KeyInfos[513] = new KeyInfo(Keys.B, Keys.O);

           KeyInfos[514] = new KeyInfo(Keys.B, Keys.Y); // bya
           KeyInfos[515] = new KeyInfo(Keys.B, Keys.Y, Keys.U);
           KeyInfos[516] = new KeyInfo(Keys.B, Keys.Y, Keys.E);
           KeyInfos[517] = new KeyInfo(Keys.B, Keys.Y, Keys.O);

           KeyInfos[518] = new KeyInfo(Keys.B, Keys.Oemtilde); // bha
           KeyInfos[519] = new KeyInfo(Keys.B, Keys.Oemtilde, Keys.I);
           KeyInfos[520] = new KeyInfo(Keys.B, Keys.Oemtilde, Keys.V);
           KeyInfos[521] = new KeyInfo(Keys.B, Keys.Oemtilde, Keys.U);
           KeyInfos[522] = new KeyInfo(Keys.B, Keys.Oemtilde, Keys.E);
           KeyInfos[523] = new KeyInfo(Keys.B, Keys.Oemtilde, Keys.O);

           KeyInfos[524] = new KeyInfo(Keys.B, Keys.Oemtilde, Keys.Y); // bhya
           KeyInfos[525] = new KeyInfo(Keys.B, Keys.Oemtilde, Keys.Y, Keys.U);
           KeyInfos[526] = new KeyInfo(Keys.B, Keys.Oemtilde, Keys.Y, Keys.E);
           KeyInfos[527] = new KeyInfo(Keys.B, Keys.Oemtilde, Keys.Y, Keys.O);

           KeyInfos[528] = new KeyInfo(Keys.F); // pfa
           KeyInfos[529] = new KeyInfo(Keys.F, Keys.I);
           KeyInfos[530] = new KeyInfo(Keys.F, Keys.V);
           KeyInfos[531] = new KeyInfo(Keys.F, Keys.U);
           KeyInfos[532] = new KeyInfo(Keys.F, Keys.E);
           KeyInfos[533] = new KeyInfo(Keys.F, Keys.O);

           KeyInfos[534] = new KeyInfo(Keys.F, Keys.Y); // pfya
           KeyInfos[535] = new KeyInfo(Keys.F, Keys.Y, Keys.U);
           KeyInfos[536] = new KeyInfo(Keys.F, Keys.Y, Keys.E);
           KeyInfos[537] = new KeyInfo(Keys.F, Keys.Y, Keys.O);
           
           KeyInfos[538] = new KeyInfo(Keys.M); // ma
           KeyInfos[539] = new KeyInfo(Keys.M, Keys.I);
           KeyInfos[540] = new KeyInfo(Keys.M, Keys.V);
           KeyInfos[541] = new KeyInfo(Keys.M, Keys.U);
           KeyInfos[542] = new KeyInfo(Keys.M, Keys.E);
           KeyInfos[543] = new KeyInfo(Keys.M, Keys.O);

           KeyInfos[544] = new KeyInfo(Keys.M, Keys.Y); // mya
           KeyInfos[545] = new KeyInfo(Keys.M, Keys.Y, Keys.U);
           KeyInfos[546] = new KeyInfo(Keys.M, Keys.Y, Keys.E);
           KeyInfos[547] = new KeyInfo(Keys.M, Keys.Y, Keys.O);

           KeyInfos[548] = new KeyInfo(Keys.Shift | Keys.F); // fa
           KeyInfos[549] = new KeyInfo(Keys.Shift | Keys.F, Keys.I);
           KeyInfos[550] = new KeyInfo(Keys.Shift | Keys.F, Keys.V);
           KeyInfos[551] = new KeyInfo(Keys.Shift | Keys.F, Keys.U);
           KeyInfos[552] = new KeyInfo(Keys.Shift | Keys.F, Keys.E);
           KeyInfos[553] = new KeyInfo(Keys.Shift | Keys.F, Keys.O);

           KeyInfos[554] = new KeyInfo(Keys.Shift | Keys.F, Keys.Y); // fya
           KeyInfos[555] = new KeyInfo(Keys.Shift | Keys.F, Keys.Y, Keys.U);
           KeyInfos[556] = new KeyInfo(Keys.Shift | Keys.F, Keys.Y, Keys.E);
           KeyInfos[557] = new KeyInfo(Keys.Shift | Keys.F, Keys.Y, Keys.O);

           KeyInfos[558] = new KeyInfo(Keys.Shift | Keys.V); // va
           KeyInfos[559] = new KeyInfo(Keys.Shift | Keys.V, Keys.I);
           KeyInfos[560] = new KeyInfo(Keys.Shift | Keys.V, Keys.V);
           KeyInfos[561] = new KeyInfo(Keys.Shift | Keys.V, Keys.U);
           KeyInfos[562] = new KeyInfo(Keys.Shift | Keys.V, Keys.E);
           KeyInfos[563] = new KeyInfo(Keys.Shift | Keys.V, Keys.O);

           KeyInfos[564] = new KeyInfo(Keys.Shift | Keys.V, Keys.Y); // vya
           KeyInfos[565] = new KeyInfo(Keys.Shift | Keys.V, Keys.Y, Keys.U);
           KeyInfos[566] = new KeyInfo(Keys.Shift | Keys.V, Keys.Y, Keys.E);
           KeyInfos[567] = new KeyInfo(Keys.Shift | Keys.V, Keys.Y, Keys.O);

           KeyInfos[568] = new KeyInfo(Keys.R); // ra
           KeyInfos[569] = new KeyInfo(Keys.R, Keys.I);
           KeyInfos[570] = new KeyInfo(Keys.R, Keys.V);
           KeyInfos[571] = new KeyInfo(Keys.R, Keys.U);
           KeyInfos[572] = new KeyInfo(Keys.R, Keys.E);
           KeyInfos[573] = new KeyInfo(Keys.R, Keys.O);

           KeyInfos[574] = new KeyInfo(Keys.R, Keys.Y); // rya
           KeyInfos[575] = new KeyInfo(Keys.R, Keys.Y, Keys.U);
           KeyInfos[576] = new KeyInfo(Keys.R, Keys.Y, Keys.E);
           KeyInfos[577] = new KeyInfo(Keys.R, Keys.Y, Keys.O);

           KeyInfos[578] = new KeyInfo(Keys.R, Keys.W); // rya
           KeyInfos[579] = new KeyInfo(Keys.R, Keys.W, Keys.I);
           KeyInfos[580] = new KeyInfo(Keys.R, Keys.W, Keys.E);
           KeyInfos[581] = new KeyInfo(Keys.R, Keys.W, Keys.O);

7   商湯      2026年2月5日 木 10:06
           KeyInfos[582] = new KeyInfo(Keys.Space); // space
           KeyInfos[583] = new KeyInfo(); // enter

           KeyInfos[584] = new KeyInfo(Keys.OemBackslash); // _ 。
           KeyInfos[585] = new KeyInfo(Keys.OemQuestion); // / 、
           KeyInfos[586] = new KeyInfo(Keys.OemSemicolon); // :
           KeyInfos[587] = new KeyInfo(Keys.Shift | Keys.OemSemicolon); // :
           KeyInfos[588] = new KeyInfo(Keys.Shift | Keys.OemQuestion); // / ?
           KeyInfos[589] = new KeyInfo(Keys.Shift | Keys.OemBackslash); // _ !
           KeyInfos[590] = new KeyInfo(Keys.Control | Keys.Shift | Keys.OemPipe); // | …

           KeyInfos[591] = new KeyInfo(Keys.Control | Keys.Shift | Keys.Oemtilde); // ` @
           KeyInfos[592] = new KeyInfo(Keys.Shift | Keys.D3); // #
           KeyInfos[593] = new KeyInfo(Keys.Control | Keys.D6); // &
           KeyInfos[594] = new KeyInfo(Keys.Shift | Keys.D5); // %
           KeyInfos[595] = new KeyInfo(Keys.OemPipe); // | |
           KeyInfos[596] = new KeyInfo(Keys.Control | Keys.Oemtilde); // `

           KeyInfos[597] = new KeyInfo(Keys.Shift | Keys.D8); // (
           KeyInfos[598] = new KeyInfo(Keys.Shift | Keys.D9); // )
           KeyInfos[599] = new KeyInfo(Keys.Shift | Keys.OemOpenBrackets); // [ {
           KeyInfos[600] = new KeyInfo(Keys.Shift | Keys.OemCloseBrackets); // ] }
           KeyInfos[601] = new KeyInfo(Keys.OemOpenBrackets); // [ [
           KeyInfos[602] = new KeyInfo(Keys.OemCloseBrackets); // ] ]
           KeyInfos[603] = new KeyInfo(Keys.Control | Keys.OemOpenBrackets); // [ 「
           KeyInfos[604] = new KeyInfo(Keys.Control | Keys.OemCloseBrackets); // ] 」
           KeyInfos[605] = new KeyInfo(Keys.Control | Keys.Shift | Keys.OemOpenBrackets); // [ 『
           KeyInfos[606] = new KeyInfo(Keys.Control | Keys.Shift | Keys.OemCloseBrackets); // ] 』
           KeyInfos[607] = new KeyInfo(Keys.Control | Keys.Shift | Keys.D8); // 【
           KeyInfos[608] = new KeyInfo(Keys.Control | Keys.Shift | Keys.D9); // 】

           KeyInfos[609] = new KeyInfo(Keys.Shift | Keys.D4); //  °
           KeyInfos[610] = new KeyInfo(Keys.Shift | Keys.D0); // ∞
           KeyInfos[611] = new KeyInfo(Keys.Control | Keys.D0); // ∝
           KeyInfos[612] = new KeyInfo(Keys.Control | Keys.Shift | Keys.D2); // ※
           KeyInfos[613] = new KeyInfo(Keys.Control | Keys.D2); // *
           KeyInfos[614] = new KeyInfo(Keys.Control | Keys.D7); // ★
           KeyInfos[615] = new KeyInfo(Keys.Shift | Keys.D7); // ☆
           KeyInfos[616] = new KeyInfo(Keys.Control | Keys.M); // ♪

           KeyInfos[617] = new KeyInfo(Keys.Control | Keys.Oemplus); // ; +
           KeyInfos[618] = new KeyInfo(Keys.OemMinus); // - -
           KeyInfos[619] = new KeyInfo(Keys.Control | Keys.Shift | Keys.Oemplus); // ; ±
           KeyInfos[620] = new KeyInfo(Keys.Control | Keys.OemMinus); // - _
           KeyInfos[621] = new KeyInfo(Keys.Control | Keys.OemSemicolon); // : ×
           KeyInfos[622] = new KeyInfo(Keys.Control | Keys.Shift | Keys.OemSemicolon); // : ・
           KeyInfos[623] = new KeyInfo(Keys.Control | Keys.OemQuestion); // / ÷
           KeyInfos[624] = new KeyInfo(Keys.Control | Keys.Shift | Keys.OemQuestion); // / /
           KeyInfos[625] = new KeyInfo(Keys.Control | Keys.Shift | Keys.OemBackslash); // _ \
           KeyInfos[626] = new KeyInfo(Keys.OemQuotes); // ^ ^
           KeyInfos[627] = new KeyInfo(Keys.Control | Keys.OemQuotes); // ^ √
           KeyInfos[628] = new KeyInfo(Keys.Control | Keys.D4); // (+)
           KeyInfos[629] = new KeyInfo(Keys.Control | Keys.Shift | Keys.D4); // (×)

           KeyInfos[630] = new KeyInfo(Keys.Shift | Keys.OemMinus); // - =
           KeyInfos[631] = new KeyInfo(Keys.Control | Keys.Shift | Keys.OemMinus); // - ≠
           KeyInfos[632] = new KeyInfo(Keys.Control | Keys.G); // ≒
           KeyInfos[633] = new KeyInfo(Keys.Control | Keys.F); // ---
           KeyInfos[634] = new KeyInfo(Keys.Control | Keys.Oemcomma); // , <
           KeyInfos[635] = new KeyInfo(Keys.Control | Keys.H); // ≪
           KeyInfos[636] = new KeyInfo(Keys.Control | Keys.Shift | Keys.Oemcomma); // , ≦
           KeyInfos[637] = new KeyInfo(Keys.Control | Keys.OemPeriod); // . >
           KeyInfos[638] = new KeyInfo(Keys.Control | Keys.J); // ≫
           KeyInfos[639] = new KeyInfo(Keys.Control | Keys.Shift | Keys.OemPeriod); // . ≧

           KeyInfos[640] = new KeyInfo(Keys.Control | Keys.D1); // ¬
           KeyInfos[641] = new KeyInfo(Keys.Shift | Keys.OemPipe); // | ∨
           KeyInfos[642] = new KeyInfo(Keys.Shift | Keys.D6); // ∧
           KeyInfos[643] = new KeyInfo(Keys.Shift | Keys.OemQuotes); // ^ ~
           KeyInfos[644] = new KeyInfo(Keys.Control | Keys.K); // ∵
           KeyInfos[645] = new KeyInfo(Keys.Control | Keys.L); // ∴
           KeyInfos[646] = new KeyInfo(Keys.Shift | Keys.A); // ∀
           KeyInfos[647] = new KeyInfo(Keys.Shift | Keys.E); // ∃

           KeyInfos[648] = new KeyInfo(Keys.Control | Keys.Q); // ∈
           KeyInfos[649] = new KeyInfo(Keys.Control | Keys.Shift | Keys.Q); // ∈/
           KeyInfos[650] = new KeyInfo(Keys.Control | Keys.E); // ∋
           KeyInfos[651] = new KeyInfo(Keys.Control | Keys.Shift | Keys.E); // ∋\
           KeyInfos[652] = new KeyInfo(Keys.Control | Keys.R); // ⊂
           KeyInfos[653] = new KeyInfo(Keys.Control | Keys.Shift | Keys.R); // ⊆
           KeyInfos[654] = new KeyInfo(Keys.Control | Keys.T); // ⊃
           KeyInfos[655] = new KeyInfo(Keys.Control | Keys.Shift | Keys.T); // ⊇
           KeyInfos[656] = new KeyInfo(Keys.Control | Keys.U); // ∪
           KeyInfos[657] = new KeyInfo(Keys.Control | Keys.Y); // ∩
           KeyInfos[658] = new KeyInfo(Keys.Control | Keys.O); // Φ

           KeyInfos[659] = new KeyInfo(Keys.Control | Keys.D); // →
           KeyInfos[660] = new KeyInfo(Keys.Control | Keys.A); // ←
           KeyInfos[661] = new KeyInfo(Keys.Control | Keys.W); // ↑
           KeyInfos[662] = new KeyInfo(Keys.Control | Keys.S); // ↓
           KeyInfos[663] = new KeyInfo(Keys.Control | Keys.Shift | Keys.D); // ⇒
           KeyInfos[664] = new KeyInfo(Keys.Control | Keys.Shift | Keys.A); // <=
           KeyInfos[665] = new KeyInfo(Keys.Control | Keys.Shift | Keys.S); // ⇔

           KeyInfos[666] = new KeyInfo(Keys.Control | Keys.Z); // Δ
           KeyInfos[667] = new KeyInfo(Keys.Control | Keys.Shift | Keys.Z); // ∇
           KeyInfos[668] = new KeyInfo(Keys.Control | Keys.X); // ∑
           KeyInfos[669] = new KeyInfo(Keys.Control | Keys.Shift | Keys.X); // Π
           KeyInfos[670] = new KeyInfo(Keys.Control | Keys.C); // d
           KeyInfos[671] = new KeyInfo(Keys.Control | Keys.Shift | Keys.C); // ∂
           KeyInfos[672] = new KeyInfo(Keys.Control | Keys.V); // ∫
           KeyInfos[673] = new KeyInfo(Keys.Control | Keys.Shift | Keys.V); // ∮
           KeyInfos[674] = new KeyInfo(Keys.Control | Keys.B); // ∬
           KeyInfos[675] = new KeyInfo(Keys.Control | Keys.Shift | Keys.B); // ∬○
           KeyInfos[676] = new KeyInfo(Keys.Control | Keys.N); // ∫∫∫
       }
8   商湯      2026年2月5日 木 10:06

       public static void ChangeColor(Bitmap bmp, byte inColorA, byte inColorR, byte inColorG, byte inColorB, byte outColorA, byte outColorR, byte outColorG, byte outColorB)
       {
           // Specify a pixel format.
           PixelFormat pxf = PixelFormat.Format32bppArgb;

           // Lock the bitmap's bits.
           Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
           BitmapData bmpData =
           bmp.LockBits(rect, ImageLockMode.ReadWrite,
                        pxf);

           // Get the address of the first line.
           IntPtr ptr = bmpData.Scan0;

           // Declare an array to hold the bytes of the bitmap.
           // int numBytes = bmp.Width * bmp.Height * 3;
           int numBytes = bmpData.Stride * bmp.Height;
           byte[] argbValues = new byte[numBytes];

           // Copy the RGB values into the array.
           Marshal.Copy(ptr, argbValues, 0, numBytes);

           // Manipulate the bitmap
           for (int counter = 0; counter < argbValues.Length; counter += 4)
           {
               if (argbValues[counter] == inColorB &&
                   argbValues[counter + 1] == inColorG &&
                   argbValues[counter + 2] == inColorR &&
                   argbValues[counter + 3] == inColorA)
               {
                   argbValues[counter] = outColorB;
                   argbValues[counter + 1] = outColorG;
                   argbValues[counter + 2] = outColorR;
                   argbValues[counter + 3] = outColorA;
               }
           }

           // Copy the RGB values back to the bitmap
           Marshal.Copy(argbValues, 0, ptr, numBytes);

           // Unlock the bits.
           bmp.UnlockBits(bmpData);
       }
   }
}
9   商湯      2026年2月5日 木 10:07
<Lexer.cs>

using System;
using System.Collections.Generic;
using Takaku.ShangAlphabet;

public enum TokenType
{
   None,
   Space,
   Comment,
   Id,
   Abc,
   Num,
   Symbol,
}

public class Token
{
   public TokenType Type;
   public List<ushort> Val;
   public Token(TokenType type, List<ushort> val) { Type = type; Val = val; }
}

// process spaces as a token
// but "_"(sha) is not supported
public static partial class G
{
   public static List<ushort> Untr(string s)
   {
       List<ushort> tmp = new List<ushort>(); ;
       tmp.AddRange((Transcription.TheTranscription.Untranscribe(s)));
       return tmp;
   }

   public static ushort Untr0(string ch)
   {
       return Untr(ch)[0];
   }

   public static Token NextTokenSha(List<ushort> l, ref int i) // 空の行はnullを戻す
   {
       if (l.Count == 0)
           return null;

       Token t = new Token(TokenType.None, new List<ushort>());

   _Start:
       if (i >= l.Count) { return null; }
       else if (l[i] == Untr0("space")) { t.Type = TokenType.Space; t.Val.Add(l[i]); i++; goto _Space; }
       else if (l[i] >= Untr0("a") && l[i] <= Untr0("rwo")) { t.Type = TokenType.Id; t.Val.Add(l[i]); i++; goto _Id; }
       else if (l[i] >= 0 && l[i] <= 9) { t.Type = TokenType.Num; t.Val.Add(l[i]); i++; goto _Num; }
       else if (l[i] == Untr0("`")) { t.Type = TokenType.Abc; i++; goto _Abc; }
       else if (l[i] == Untr0("♪")) { t.Type = TokenType.Comment; i++; return t; }
       else { t.Type = TokenType.Symbol; t.Val.Add(l[i]); i++; return t; } // a symbol
   _Space:
       if (i >= l.Count) { return t; }
       else if (l[i] == Untr0("space")) { t.Val.Add(l[i]); i++; goto _Space; }
       else { return t; }
   //_Comment:
   //    if (i >= l.Count) { return t; }
   //    else { t.Val.Add(l[i]); i++; goto _Comment; }
   _Id:
       if (i >= l.Count) { return t; }
       else if (l[i] >= Untr0("a") && l[i] <= Untr0("rwo")) { t.Val.Add(l[i]); i++; goto _Id; }
       else { return t; }
   _Abc:
       if (i >= l.Count) { return t; }
       else if (l[i] >= Untr0("a") && l[i] <= Untr0("rwo")) { t.Val.Add(l[i]); i++; goto _Abc; }
       else { return t; }
   _Num:
       if (i >= l.Count) { return t; }
       else if (l[i] >= 0 && l[i] <= 9) { t.Val.Add(l[i]); i++; goto _Num; }
       else { return t; }
   }

}
10   商湯      2026年2月5日 木 10:08
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Takaku.ShangAlphabet;

public static partial class G
{
   public static string Mul(char ch, int count)
   {
       string s = "";
       for (int i = 0; i < count; i++)
           s += ch;
       return s;
   }

   public static bool Cmp(List<ushort> a, List<ushort> b)
   {
       if (a.Count != b.Count)
           return false;
       for (int i = 0; i <= a.Count - 1; i++)
       {
           if (a[i] != b[i])
               return false;
       }
       return true;
   }

   public static void Conv(List<ushort> _sha, ref string _op)
   {
       List<List<ushort>> sha = new List<List<ushort>>();
       sha.Add(new List<ushort>());
       for (int i = 0; i <= _sha.Count - 1; i++)
       {
           if (_sha[i] == 583)
           {
               sha.Add(new List<ushort>());
           }
           else
               sha[sha.Count - 1].Add(_sha[i]);
       }

       List<List<string>> op = new List<List<string>>();

       _Conv(sha, op);

       _op = "";
       for (int i = 0; i <= op.Count - 1; i++)
       {
           for (int j = 0; j <= op[i].Count - 1; j++)
           {
               _op += op[i][j];
           }

           _op += "\r\n";
       }
   }

   public static void _Conv(List<List<ushort>> sha, List<List<string>> op)
   {
       op.Clear();

       for (int l = 0; l <= sha.Count - 1; l++)
       {
           op.Add(new List<string>());

           int i = 0;
           while (i <= sha[l].Count - 1)
           {
               Token t = NextTokenSha(sha[l], ref i);

               string s = null;

               if (t.Type == TokenType.Space)
               {
                   s = Mul(' ', t.Val.Count);
               }
               else if (t.Type == TokenType.Comment)
               {
                   s = "//"; // + Transcription.TheTranscription.Transcribe(t.Val.ToArray());
               }
               else if (t.Type == TokenType.Id)
               {
                  if (!MapKeyword(t.Val, ref s))
                       s = Transcription.TheTranscription.Transcribe(t.Val.ToArray());
               }
               else if (t.Type == TokenType.Abc)
               {
                   s = MapAbc(t.Val);
               }
               else if (t.Type == TokenType.Num)
               {
                   s = Transcription.TheTranscription.TranslateNumber(t.Val.ToArray());
               }
               else if (t.Type == TokenType.Symbol)
               {
                   s = MapSymbol(t.Val[0]);
               }

               op[l].Add(s);
           }
       }
   }

   public static bool MapKeyword(List<ushort> sha, ref string s)
   {
       foreach (List<ushort> i in Keywords.Keys)
       {
           if (Cmp(i, sha))
           {
               s = Keywords[i];
               return true;
           }
       }

       return false;
   }

   public static string MapAbc(List<ushort> sha)
   {
       string s = "";

       for (int i = 0; i <= sha.Count - 1; i++)
       {
           foreach (ushort j in Chars.Keys)
           {
               if (sha[i] == j)
               {
                   s += Chars[j];

                   goto _L;
               }
           }

           s += "X";

       _L: ;
       }

       return s;
   }

   public static string MapSymbol(ushort sha)
   {
       if (Symbols.Keys.Contains(sha))
           return Symbols[sha];
       else
           return Transcription.TheTranscription.Transcribe(new ushort[]{ sha, });
   }

   public static Dictionary<List<ushort>, string> Keywords = new Dictionary<List<ushort>, string>();
   public static Dictionary<ushort, string> Symbols = new Dictionary<ushort, string>();
   public static Dictionary<ushort, char> Chars = new Dictionary<ushort, char>();

   public static void SetupKeywords()
   {
       Keywords.Add(Untr("ta_ku_wa_e_ta"), "Cached");
       Keywords.Add(Untr("a_ri_sa_ma"), "State");
       Keywords.Add(Untr("ko_ma_ka_wa_ke"), "Diff");

       Keywords.Add(Untr("u_tseu_Si"), "as");

       Keywords.Add(Untr("mo_to"), "base");
       Keywords.Add(Untr("bu_ru"), "bool");
       Keywords.Add(Untr("to_ma_ru"), "break");
       Keywords.Add(Untr("dZi_bu_Si"), "byte"); // sbyte sa_dzi_bu_Si

       Keywords.Add(Untr("ba_a_i"), "case");
       Keywords.Add(Untr("to_ra_e_ru"), "catch");
       Keywords.Add(Untr("dZi"), "char");
       Keywords.Add(Untr("ta_gu_i"), "class");
       Keywords.Add(Untr("sa_da_ma_ri"), "const");
       Keywords.Add(Untr("tseu_dzeu_ke"), "continue");

       Keywords.Add(Untr("seu_de_nji_sa_da_me"), "default");
       Keywords.Add(Untr("ka_wa_ri"), "delegate");
       Keywords.Add(Untr("Si_ro"), "do");
       Keywords.Add(Untr("Pu_ta"), "double");

       Keywords.Add(Untr("de_na_i_to"), "else");
       Keywords.Add(Untr("re_H_kyo"), "enum");
       Keywords.Add(Untr("ha_H_ki_ri"), "explicit"); // implicit da_ma_ru
       Keywords.Add(Untr("so_to_ka_ra"), "extern");

       Keywords.Add(Untr("i_na"), "false"); // true ha_i
       Keywords.Add(Untr("o_wa_ru"), "finally");
       Keywords.Add(Untr("u_ki"), "float");
       Keywords.Add(Untr("no_ta_me"), "for");
       Keywords.Add(Untr("o_no_o_no"), "foreach");

       Keywords.Add(Untr("i_ke"), "goto");

       Keywords.Add(Untr("mo_Si"), "if");
       Keywords.Add(Untr("da_ma_ru"), "implicit");
       Keywords.Add(Untr("u_tSi"), "in"); // out so_to
       Keywords.Add(Untr("to_to_no_i"), "int"); // uint u_to_to_no_e
       Keywords.Add(Untr("tseu_na_ga_ri"), "interface");
       Keywords.Add(Untr("dzo_ku_seu_ru"), "is");

       Keywords.Add(Untr("to_dza_seu"), "lock");
       Keywords.Add(Untr("na_ga"), "long"); // short mi_dZi_ka ulong u_na_ga

       Keywords.Add(Untr("na_ma_e_ma"), "namespace");
       Keywords.Add(Untr("a_ta_ra_Si_i"), "new");
       Keywords.Add(Untr("na_Si"), "null");

       Keywords.Add(Untr("a_i_te"), "object");
       Keywords.Add(Untr("e_N_dza_N_Si"), "operator");
       Keywords.Add(Untr("so_to"), "out");
       Keywords.Add(Untr("u_wa_ga_ki"), "override");

       Keywords.Add(Untr("Ci_ki"), "params");
       Keywords.Add(Untr("wa_ta_ku_Si"), "private");
       Keywords.Add(Untr("ma_mo_ru"), "protected");
       Keywords.Add(Untr("o_o_ya_ke"), "public");

       Keywords.Add(Untr("yo_mi_no_mi"), "readonly");
       Keywords.Add(Untr("tsa_N_tSe_u"), "ref");
       Keywords.Add(Untr("ka_e_se"), "return");

       Keywords.Add(Untr("sa_dZi_bu_Si"), "sbyte");
       Keywords.Add(Untr("mi_dZi_ka"), "short");
       Keywords.Add(Untr("o_o_ki_sa"), "sizeof");
       Keywords.Add(Untr("Si_dzeu_ka"), "static");
       Keywords.Add(Untr("dZi_na_ra_be"), "string");
       Keywords.Add(Untr("ka_ra_ku_ri"), "struct");
       Keywords.Add(Untr("ki_ri_ka_e"), "switch");

       Keywords.Add(Untr("ko_re"), "this");
       Keywords.Add(Untr("na_ge_ru"), "throw");
       Keywords.Add(Untr("ha_i"), "true");
       Keywords.Add(Untr("ta_me_seu"), "try");
       Keywords.Add(Untr("ka_ta"), "typeof");

       Keywords.Add(Untr("u_to_to_no_e"), "uint");
       Keywords.Add(Untr("u_na_ga"), "ulong");
       Keywords.Add(Untr("u_mi_dZi_ka"), "ushort");
       Keywords.Add(Untr("tseu_ka_u"), "using");

       Keywords.Add(Untr("ka_ri_o_mo_i"), "virtual");
       Keywords.Add(Untr("mu_na_Si"), "void");

       Keywords.Add(Untr("no_to_ki"), "while");
   }
11   商湯      2026年2月5日 木 10:08
   public static void SetupSymbols()
   {
       Symbols.Add(Untr0("…"), "_");
       Symbols.Add(Untr0("・"), ".");

       Symbols.Add(Untr0(":"), ":");
       Symbols.Add(Untr0(";"), ";");
       Symbols.Add(Untr0("、"), ",");

       Symbols.Add(Untr0("←"), "=");
       Symbols.Add(Untr0("="), "==");
       Symbols.Add(Untr0("≠"), "!=");
       Symbols.Add(Untr0("<"), "<");
       Symbols.Add(Untr0(">"), ">");
       Symbols.Add(Untr0("≦"), "<=");
       Symbols.Add(Untr0("≧"), ">=");
       Symbols.Add(Untr0("≪"), "<<");
       Symbols.Add(Untr0("≫"), ">>");

       Symbols.Add(Untr0("+"), "+");
       Symbols.Add(Untr0("-"), "-");
       Symbols.Add(Untr0("×"), "*");
       Symbols.Add(Untr0("÷"), "/");
       // no ++, --, += etc supported

       Symbols.Add(Untr0("#"), "~");
       Symbols.Add(Untr0("|"), "|");
       Symbols.Add(Untr0("&"), "&");
       Symbols.Add(Untr0("¬"), "!");
       Symbols.Add(Untr0("∨"), "||");
       Symbols.Add(Untr0("∧"), "&&");
       Symbols.Add(Untr0("~"), "^");

       Symbols.Add(Untr0("『"), "\"");
       Symbols.Add(Untr0("』"), "\"");
       Symbols.Add(Untr0("「"), "'");
       Symbols.Add(Untr0("」"), "'");
       Symbols.Add(Untr0("@"), "@");

       Symbols.Add(Untr0("("), "(");
       Symbols.Add(Untr0(")"), ")");
       Symbols.Add(Untr0("["), "[");
       Symbols.Add(Untr0("]"), "]");
       Symbols.Add(Untr0("{"), "{");
       Symbols.Add(Untr0("}"), "}");

       Symbols.Add(Untr0("⇒"), "=>");
   }

   public static void SetupChars()
   {
       Chars.Add(Untr0("a"), 'a');
       Chars.Add(Untr0("hha"), 'A');

       Chars.Add(Untr0("ba"), 'b');
       Chars.Add(Untr0("bha"), 'B');

       Chars.Add(Untr0("ca"), 'c');
       Chars.Add(Untr0("cha"), 'C');

       Chars.Add(Untr0("da"), 'd');
       Chars.Add(Untr0("dha"), 'D');

       Chars.Add(Untr0("e"), 'e');
       Chars.Add(Untr0("hhe"), 'E');

       Chars.Add(Untr0("fa"), 'f');
       Chars.Add(Untr0("fo"), 'F');

       Chars.Add(Untr0("ga"), 'g');
       Chars.Add(Untr0("gha"), 'G');

       Chars.Add(Untr0("ha"), 'h');
       Chars.Add(Untr0("ho"), 'H');

       Chars.Add(Untr0("i"), 'i');
       Chars.Add(Untr0("hhi"), 'I');

       Chars.Add(Untr0("ja"), 'j');
       Chars.Add(Untr0("jha"), 'J');

       Chars.Add(Untr0("ka"), 'k');
       Chars.Add(Untr0("kha"), 'K');

       Chars.Add(Untr0("ri"), 'l');
       Chars.Add(Untr0("re"), 'L');

       Chars.Add(Untr0("ma"), 'm');
       Chars.Add(Untr0("mo"), 'M');

       Chars.Add(Untr0("na"), 'n');
       Chars.Add(Untr0("no"), 'N');

       Chars.Add(Untr0("o"), 'o');
       Chars.Add(Untr0("hho"), 'O');

       Chars.Add(Untr0("pa"), 'p');
       Chars.Add(Untr0("pha"), 'P');

       Chars.Add(Untr0("qa"), 'q');
       Chars.Add(Untr0("qha"), 'Q');

       Chars.Add(Untr0("ra"), 'r');
       Chars.Add(Untr0("ro"), 'R');

       Chars.Add(Untr0("sa"), 's');
       Chars.Add(Untr0("so"), 'S');

       Chars.Add(Untr0("ta"), 't');
       Chars.Add(Untr0("tha"), 'T');

       Chars.Add(Untr0("u"), 'u');
       Chars.Add(Untr0("hhu"), 'U');

       Chars.Add(Untr0("va"), 'v');
       Chars.Add(Untr0("vo"), 'V');

       Chars.Add(Untr0("wa"), 'w');
       Chars.Add(Untr0("hhwa"), 'W');

       Chars.Add(Untr0("Sa"), 'x');
       Chars.Add(Untr0("So"), 'X');

       Chars.Add(Untr0("ya"), 'y');
       Chars.Add(Untr0("hhya"), 'Y');

       Chars.Add(Untr0("za"), 'z');
       Chars.Add(Untr0("zo"), 'Z');
   }
名前      編集用パスワード(省略可)    パスワードの記憶
数式 αβγ IPA http:// 画像 B I U 上 下
(添付ファイルは http://www.jkofsp.net/up/ にアップロードしてください)