依然灬特雷西丶 發表於 2026-1-5 09:11:26

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、核心架构设计</li><li>二、关键代码实现</li><ul class="second_class_ul"><li>1. 输入法核心类</li><li>2. 拼音输入实现</li><li>3. 五笔输入实现</li></ul><li>三、词库管理</li><ul class="second_class_ul"><li>1. 词库加载</li><li>2. 示例词库格式</li></ul><li>四、界面实现(WinForm)</li><ul class="second_class_ul"><li>1. 候选词窗口</li></ul><li>五、输入模式切换</li><ul class="second_class_ul"></ul><li>六、部署与使用</li><ul class="second_class_ul"><li>1. 项目结构</li><li>2. 安装说明</li></ul><li>七、扩展功能建议</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>一、核心架构设计</h2>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010509120995.png" /></p>
<p class="maodian"></p><h2>二、关键代码实现</h2>
<p class="maodian"></p><h3>1. 输入法核心类</h3>
<div class="jb51code"><pre class="brush:csharp;">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&lt;string, List&lt;string&gt;&gt; _pinyinCache = new();
    private static Dictionary&lt;string, string&gt; _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 &gt;= 0 &amp;&amp; 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);
      }
    }
}
</pre></div>
<p class="maodian"></p><h3>2. 拼音输入实现</h3>
<div class="jb51code"><pre class="brush:csharp;">public static class PinyinConverter
{
    private static Pinyin4Net.PinyinHelper _pinyinHelper = new();

    // 拼音转候选词
    public static List&lt;string&gt; GetPinyinCandidates(string pinyin)
    {
      var candidates = new List&lt;string&gt;();
      var pinyinArray = _pinyinHelper.GetPinyinWithToneMark(pinyin);
      
      foreach (var py in pinyinArray)
      {
            if (_pinyinCache.ContainsKey(py))
            {
                candidates.AddRange(_pinyinCache);
            }
      }
      return candidates.Distinct().ToList();
    }
}
</pre></div>
<p class="maodian"></p><h3>3. 五笔输入实现</h3>
<div class="jb51code"><pre class="brush:csharp;">public static class WubiConverter
{
    // 五笔编码解析
    public static string GetWubiCandidate(string code)
    {
      if (_wubiCache.TryGetValue(code, out string result))
      {
            return result;
      }
      return string.Empty;
    }
}
</pre></div>
<p class="maodian"></p><h2>三、词库管理</h2>
<p class="maodian"></p><h3>1. 词库加载</h3>
<div class="jb51code"><pre class="brush:csharp;">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, parts.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, parts);
      }
    }
}
</pre></div>
<p class="maodian"></p><h3>2. 示例词库格式</h3>
<p><strong>pinyin.txt</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">ai        爱,艾,唉
shi        是,事,市
</pre></div>
<p><strong>wubi.txt</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">aaaa        的
bbbb        一
cccc        是
</pre></div>
<p class="maodian"></p><h2>四、界面实现(WinForm)</h2>
<p class="maodian"></p><h3>1. 候选词窗口</h3>
<div class="jb51code"><pre class="brush:csharp;">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&lt;string&gt; 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();
      }
    }
}
</pre></div>
<p class="maodian"></p><h2>五、输入模式切换</h2>
<div class="jb51code"><pre class="brush:csharp;">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;
            }
      }
    }
}
</pre></div>
<p>参考代码 C# 版输入法 源码(支持五笔输入、拼音输入) www.youwenfan.com/contentcsp/93154.html</p>
<p class="maodian"></p><h2>六、部署与使用</h2>
<p class="maodian"></p><h3>1. 项目结构</h3>
<div class="jb51code"><pre class="brush:plain;">InputMethodDemo/
├── Libs/
│   ├── pinyin4net.dll
│   └── WubiLib.dll
├── Data/
│   ├── pinyin.txt
│   └── wubi.txt
├── Forms/
│   ├── MainForm.cs
│   └── CandidateForm.cs
└── InputMethod.dll
</pre></div>
<p class="maodian"></p><h3>2. 安装说明</h3>
<ol><li>将<code>InputMethod.dll</code>注册为全局钩子</li><li>在目标程序中引用输入法库</li><li>初始化词库:</li></ol>
<div class="jb51code"><pre class="brush:csharp;">InputMethod.LoadPinyinDictionary("Data/pinyin.txt");
InputMethod.LoadWubiDictionary("Data/wubi.txt");
</pre></div>
<p class="maodian"></p><h2>七、扩展功能建议</h2>
<ol><li><strong>智能联想</strong> 根据输入历史记录推荐高频字词</li><li><strong>手写输入</strong> 集成微软手写识别SDK</li><li><strong>云词库</strong> 通过HTTP接口获取最新词汇</li><li><strong>自定义短语</strong> 支持用户自定义短语映射</li></ol>
<p>以上就是基于C#实现的支持五笔和拼音输入的输入法的详细内容,更多关于C#支持五笔和拼音输入的输入法的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>C#实现输入法功能详解</li><li>C#中Winfrom默认输入法的设置方法</li><li>C#设置输入法实例分析</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 基于C#实现的支持五笔和拼音输入的输入法