基于C#实现的支持五笔和拼音输入的输入法
一、核心架构设计

二、关键代码实现
1. 输入法核心类
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class InputMethod
{
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc _proc;
private static IntPtr _hookID = IntPtr.Zero;
// 词库缓存
private static Dictionary<string, List<string>> _pinyinCache = new();
private static Dictionary<string, string> _wubiCache = new();
// 输入模式
public enum InputMode { Pinyin, Wubi }
public static InputMode CurrentMode { get; set; }
// 初始化
static InputMethod()
{
LoadPinyinDictionary("pinyin.txt");
LoadWubiDictionary("wubi.txt");
}
// 安装钩子
public static void InstallHook()
{
_proc = HookCallback;
_hookID = SetHook(_proc);
}
// 卸载钩子
public static void UninstallHook()
{
UnhookWindowsHookEx(_hookID);
}
// 键盘事件处理
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
Keys key = (Keys)vkCode;
if (key == Keys.Space)
{
ProcessCommit();
}
else if (key == Keys.Back)
{
ProcessBackspace();
}
else
{
ProcessInput(key);
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
// 输入处理
private static void ProcessInput(Keys key)
{
char c = (char)key;
string input = c.ToString();
if (CurrentMode == InputMode.Pinyin)
{
UpdatePinyinCandidates(input);
}
else if (CurrentMode == InputMode.Wubi)
{
UpdateWubiCandidates(input);
}
}
}
2. 拼音输入实现
public static class PinyinConverter
{
private static Pinyin4Net.PinyinHelper _pinyinHelper = new();
// 拼音转候选词
public static List<string> GetPinyinCandidates(string pinyin)
{
var candidates = new List<string>();
var pinyinArray = _pinyinHelper.GetPinyinWithToneMark(pinyin);
foreach (var py in pinyinArray)
{
if (_pinyinCache.ContainsKey(py))
{
candidates.AddRange(_pinyinCache[py]);
}
}
return candidates.Distinct().ToList();
}
}
3. 五笔输入实现
public static class WubiConverter
{
// 五笔编码解析
public static string GetWubiCandidate(string code)
{
if (_wubiCache.TryGetValue(code, out string result))
{
return result;
}
return string.Empty;
}
}
三、词库管理
1. 词库加载
private static void LoadPinyinDictionary(string path)
{
var lines = File.ReadAllLines(path);
foreach (var line in lines)
{
var parts = line.Split('\t');
if (parts.Length == 2)
{
_pinyinCache.Add(parts[0], parts[1].Split(',').ToList());
}
}
}
private static void LoadWubiDictionary(string path)
{
var lines = File.ReadAllLines(path);
foreach (var line in lines)
{
var parts = line.Split(' ');
if (parts.Length == 2)
{
_wubiCache.Add(parts[0], parts[1]);
}
}
}
2. 示例词库格式
pinyin.txt:
ai 爱,艾,唉
shi 是,事,市
wubi.txt:
aaaa 的
bbbb 一
cccc 是
四、界面实现(WinForm)
1. 候选词窗口
public partial class CandidateForm : Form
{
private ListBox _candidateList;
private string _currentInput = string.Empty;
public CandidateForm()
{
InitializeComponent();
_candidateList = new ListBox { Dock = DockStyle.Fill };
Controls.Add(_candidateList);
}
public void UpdateCandidates(List<string> candidates)
{
_candidateList.Items.Clear();
_candidateList.Items.AddRange(candidates.ToArray());
}
private void CandidateForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
string selected = _candidateList.SelectedItem.ToString();
InputMethod.CommitText(selected);
this.Hide();
}
}
}
五、输入模式切换
public static class InputModeSwitcher
{
public static void SwitchToPinyin()
{
CurrentMode = InputMethod.InputMode.Pinyin;
// 切换系统输入法到拼音
SetInputMethod("Microsoft Pinyin");
}
public static void SwitchToWubi()
{
CurrentMode = InputMethod.InputMode.Wubi;
// 切换系统输入法到五笔
SetInputMethod("王码五笔");
}
private static void SetInputMethod(string layoutName)
{
foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages)
{
if (lang.LayoutName.Contains(layoutName))
{
InputLanguage.CurrentInputLanguage = lang;
break;
}
}
}
}
参考代码 C# 版输入法 源码(支持五笔输入、拼音输入) www.youwenfan.com/contentcnn/93154.html
六、部署与使用
1. 项目结构
InputMethodDemo/
├── Libs/
│ ├── pinyin4net.dll
│ └── WubiLib.dll
├── Data/
│ ├── pinyin.txt
│ └── wubi.txt
├── Forms/
│ ├── MainForm.cs
│ └── CandidateForm.cs
└── InputMethod.dll
2. 安装说明
-
将
InputMethod.dll注册为全局钩子 -
在目标程序中引用输入法库
-
初始化词库:
InputMethod.LoadPinyinDictionary("Data/pinyin.txt"); InputMethod.LoadWubiDictionary("Data/wubi.txt");
七、扩展功能建议
- 智能联想 根据输入历史记录推荐高频字词
- 手写输入 集成微软手写识别SDK
- 云词库 通过HTTP接口获取最新词汇
- 自定义短语 支持用户自定义短语映射
浙公网安备 33010602011771号