C#实现输入法功能详解

2019-12-30 16:51:20于海丽

2.安装完后就要对获取到钩子进行处理:


private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
  {
   // 侦听键盘事件
   if (nCode >= 0 && wParam == 0x0100)
   {
    KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
    #region 开关
    if (MyKeyboardHookStruct.vkCode == 20 || MyKeyboardHookStruct.vkCode == 160 || MyKeyboardHookStruct.vkCode == 161)
    {
     isLocked = isLocked ? false : true;
    }
    #endregion
    #region
    if (isLocked)
    {
     if (isStarted && MyKeyboardHookStruct.vkCode >= 48 && MyKeyboardHookStruct.vkCode <= 57)
     {
      var c = int.Parse(((char)MyKeyboardHookStruct.vkCode).ToString());
      OnSpaced(c);
      isStarted = false;
      return 1;
     }
     if (isStarted && MyKeyboardHookStruct.vkCode == 8)
     {
      OnBacked();
      return 1;
     }
     if ((MyKeyboardHookStruct.vkCode >= 65 && MyKeyboardHookStruct.vkCode <= 90) || MyKeyboardHookStruct.vkCode == 32)
     {
      if (MyKeyboardHookStruct.vkCode >= 65 && MyKeyboardHookStruct.vkCode <= 90)
      {
       Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
       KeyEventArgs e = new KeyEventArgs(keyData);
       KeyUpEvent(this, e);
       isStarted = true;
      }
      if (MyKeyboardHookStruct.vkCode == 32)
      {
       OnSpaced(0);
       isStarted = false;
      }
      return 1;
     }
     else
      return 0;
    }
    #endregion
   }
   return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
  }

上面一些数字,对于刚入门的同学来说也不是什么问题,一看就明白是对哪些键做的操作。

3.停止钩子


public void Stop()
  {
   bool retKeyboard = true;
   if (hKeyboardHook != 0)
   {
    retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
    hKeyboardHook = 0;
   }
   if (!(retKeyboard))
    throw new Exception("卸载钩子失败!");
  }

4.注册事件


 private void WordBoard_Load(object sender, EventArgs e)
   {
    Program.keyBordHook.KeyUpEvent += KeyBordHook_KeyUpEvent;
    Program.keyBordHook.OnSpaced += KeyBordHook_OnSpaced;
    Program.keyBordHook.OnBacked += KeyBordHook_OnBacked;
   }

5.根据输入内容显示并进行转换


private void ShowCharatar()
  {
   this.listView1.BeginInvoke(new Action(() =>
   {
    label1.Text = keys;
    try
    {
     this.listView1.Items.Clear();
     var arr = CacheHelper.Get(keys);
     if (arr != null)
      for (int i = 0; i < (arr.Length > 10 ? 9 : arr.Length); i++)
      {
       this.listView1.Items.Add((i + 1) + "、" + arr[i]);
      }
    }
    catch
    {
     label1.Text = keys = "";
    }
   }));
  }

6.显示输入


 private void KeyBordHook_KeyUpEvent(object sender, KeyEventArgs e)
   {
    keys += e.KeyCode.ToString().ToLower();
    this.ShowCharatar();
   }