基于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#支持五笔和拼音输入的输入法的资料请关注脚本之家其它相关文章!

相关文章

  • Winform ComboBox如何独立绘制下拉选项的字体颜色

    Winform ComboBox如何独立绘制下拉选项的字体颜色

    这篇文章主要介绍了Winform ComboBox如何独立绘制下拉选项的字体颜色,帮助大家更好的理解和使用c# winform,感兴趣的朋友可以了解下
    2020-11-11
  • C# StartsWith 字符串的实例方法解析

    C# StartsWith 字符串的实例方法解析

    这篇文章主要介绍了C# StartsWith 字符串的实例方法,StartsWith 方法对于需要检查字符串的前缀是否匹配特定模式的情况非常有用,你可以根据返回的布尔值,根据需要执行相应的逻辑操作,需要的朋友可以参考下
    2024-03-03
  • C#线程倒计时器源码分享

    C#线程倒计时器源码分享

    这篇文章主要为大家分享了C#线程倒计时器源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C# WinForm实现Socket异步通讯的步骤详解

    C# WinForm实现Socket异步通讯的步骤详解

    Socket通讯是网络编程中非常基础且重要的一部分,它为应用程序提供了基于TCP/IP协议进行数据传输的能力,本文将详细介绍如何在C#的WinForm应用程序中实现Socket的异步通讯,希望能为有需要的开发提供一些参考,需要的朋友可以参考下
    2025-07-07
  • C#实现IP代理池调度的示例代码

    C#实现IP代理池调度的示例代码

    这篇文章主要为大家介绍了C#实现IP代理池调度的相关知识,文中的示例代码讲解详细,具有一定的参考与学习价值,感兴趣的小伙伴可以了解一下
    2023-07-07
  • C#转TypeScript的完整指南

    C#转TypeScript的完整指南

    本文对比了C#和TypeScript的异同,指出它们在变量类型、类与接口、泛型、异步编程等方面具有相似之处,同时也指出了TypeScript在运行环境、类型系统、基础类型、空值处理等方面的差异,并给出了从C#转向TypeScript的建议,强调C#经验可以直接迁移,需要的朋友可以参考下
    2026-03-03
  • C#结合Spire.Doc for .NET实现将XML转为PDF

    C#结合Spire.Doc for .NET实现将XML转为PDF

    可扩展标记语言(XML)文件是一种标准的文本文件,它使用自定义标签来描述文档的结构及其他特性,本文将演示如何使用 Spire.Doc for .NET 在 C# 和 VB.NET 中实现 XML 到 PDF 的转换,有需要的可以了解下
    2026-03-03
  • C#中限制并发任务数量的高效方法与技巧分享

    C#中限制并发任务数量的高效方法与技巧分享

    在C#中,处理并发操作是一项常见且强大的功能,尤其是在需要执行多个任务但又希望限制同时运行任务数量的场景中,本文将深入探讨几种有效的方法来限制C#中的并发任务数量,并通过具体的应用场景和示例代码展示如何实现这些方法,需要的朋友可以参考下
    2024-12-12
  • C#基本概念列举详解

    C#基本概念列举详解

    这篇文章主要介绍了C#基本概念列举,需要的朋友可以参考下
    2014-02-02
  • C#中String类常用方法汇总

    C#中String类常用方法汇总

    这篇文章主要介绍了C#中String类常用方法,较为详细的汇总了String类中的常用方法,对于深入掌握C#字符串操作有着很好的学习借鉴价值,需要的朋友可以参考下
    2014-11-11

最新评论