基于C#实现的支持五笔和拼音输入的输入法

 更新时间:2026年01月05日 09:11:26   作者:fengfuyao985  
该文章介绍了如何设计和实现一个支持五笔和拼音输入的中文输入法,它详细描述了核心架构、关键代码实现、词库管理、界面设计、输入模式切换以及部署与使用,文章还提出了智能联想、手写输入、云词库和自定义短语等扩展功能建议,需要的朋友可以参考下

一、核心架构设计

二、关键代码实现

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/contentcsp/93154.html

六、部署与使用

1. 项目结构

InputMethodDemo/
├── Libs/
│   ├── pinyin4net.dll
│   └── WubiLib.dll
├── Data/
│   ├── pinyin.txt
│   └── wubi.txt
├── Forms/
│   ├── MainForm.cs
│   └── CandidateForm.cs
└── InputMethod.dll

2. 安装说明

  1. InputMethod.dll注册为全局钩子
  2. 在目标程序中引用输入法库
  3. 初始化词库:
InputMethod.LoadPinyinDictionary("Data/pinyin.txt");
InputMethod.LoadWubiDictionary("Data/wubi.txt");

七、扩展功能建议

  1. 智能联想 根据输入历史记录推荐高频字词
  2. 手写输入 集成微软手写识别SDK
  3. 云词库 通过HTTP接口获取最新词汇
  4. 自定义短语 支持用户自定义短语映射

以上就是基于C#实现的支持五笔和拼音输入的输入法的详细内容,更多关于C#支持五笔和拼音输入的输入法的资料请关注脚本之家其它相关文章!

相关文章

  • C#判断一个矩阵是否为对称矩阵及反称矩阵的方法

    C#判断一个矩阵是否为对称矩阵及反称矩阵的方法

    这篇文章主要介绍了C#判断一个矩阵是否为对称矩阵及反称矩阵的方法,涉及C#矩阵遍历及检查等相关运算技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C# 利用StringBuilder提升字符串拼接性能的小例子

    C# 利用StringBuilder提升字符串拼接性能的小例子

    一个项目中有数据图表呈现,数据量稍大时显得很慢,在使用了StringBuilder后效果提升很明显,下面有例子
    2013-07-07
  • C#心跳机制服务器的示例代码

    C#心跳机制服务器的示例代码

    心跳机制出现在tcp长连接中,客户端和服务器之见定时发送一种特殊的数据包,本文主要介绍了C#心跳机制服务器的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • C#使用ML.Net完成人工智能预测

    C#使用ML.Net完成人工智能预测

    这篇文章主要介绍了C#使用ML.Net完成人工智能预测的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • C#导出Excel的方法

    C#导出Excel的方法

    本文给大家分享的是基于.net 1.0开发的程序如何实现导出Excel的方法和示例,使用的是UltraWebGrid自带导出Excel的控件,非常的简单实用,有需要的小伙伴可以参考下。
    2015-06-06
  • 为何Linq的Distinct实在是不给力

    为何Linq的Distinct实在是不给力

    本篇文章对Linq的Distinct进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 基于C#对用户密码使用MD5加密与解密

    基于C#对用户密码使用MD5加密与解密

    C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式。本文总结了通用的算法并结合了自己的一点小经验,分享给大家
    2015-12-12
  • C# GraphicsPath的用法示例详解

    C# GraphicsPath的用法示例详解

    C#中GraphicsPath用于创建复杂图形路径,支持填充、描边及点检测,需注意坐标一致、路径闭合、Pen/Brush设置、性能优化、用户反馈和调试方法,以确保绘制准确和交互体验,本文给大家介绍C# GraphicsPath的用法,感兴趣的朋友一起看看吧
    2025-07-07
  • C#圆形头像框制作并从数据库读取

    C#圆形头像框制作并从数据库读取

    本文主要介绍了C#圆形头像框制作并从数据库读取,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 配置C#的系统环境变量的方法

    配置C#的系统环境变量的方法

    配置C#的系统环境变量的方法...
    2007-03-03

最新评论