基于C#實(shí)現(xiàn)的支持五筆和拼音輸入的輸入法
一、核心架構(gòu)設(shè)計(jì)

二、關(guān)鍵代碼實(shí)現(xiàn)
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;
// 詞庫(kù)緩存
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);
}
// 鍵盤(pán)事件處理
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. 拼音輸入實(shí)現(xiàn)
public static class PinyinConverter
{
private static Pinyin4Net.PinyinHelper _pinyinHelper = new();
// 拼音轉(zhuǎn)候選詞
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. 五筆輸入實(shí)現(xiàn)
public static class WubiConverter
{
// 五筆編碼解析
public static string GetWubiCandidate(string code)
{
if (_wubiCache.TryGetValue(code, out string result))
{
return result;
}
return string.Empty;
}
}
三、詞庫(kù)管理
1. 詞庫(kù)加載
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. 示例詞庫(kù)格式
pinyin.txt:
ai 愛(ài),艾,唉 shi 是,事,市
wubi.txt:
aaaa 的 bbbb 一 cccc 是
四、界面實(shí)現(xiàn)(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;
// 切換系統(tǒng)輸入法到拼音
SetInputMethod("Microsoft Pinyin");
}
public static void SwitchToWubi()
{
CurrentMode = InputMethod.InputMode.Wubi;
// 切換系統(tǒng)輸入法到五筆
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. 項(xiàng)目結(jié)構(gòu)
InputMethodDemo/ ├── Libs/ │ ├── pinyin4net.dll │ └── WubiLib.dll ├── Data/ │ ├── pinyin.txt │ └── wubi.txt ├── Forms/ │ ├── MainForm.cs │ └── CandidateForm.cs └── InputMethod.dll
2. 安裝說(shuō)明
- 將
InputMethod.dll注冊(cè)為全局鉤子 - 在目標(biāo)程序中引用輸入法庫(kù)
- 初始化詞庫(kù):
InputMethod.LoadPinyinDictionary("Data/pinyin.txt");
InputMethod.LoadWubiDictionary("Data/wubi.txt");
七、擴(kuò)展功能建議
- 智能聯(lián)想 根據(jù)輸入歷史記錄推薦高頻字詞
- 手寫(xiě)輸入 集成微軟手寫(xiě)識(shí)別SDK
- 云詞庫(kù) 通過(guò)HTTP接口獲取最新詞匯
- 自定義短語(yǔ) 支持用戶自定義短語(yǔ)映射
以上就是基于C#實(shí)現(xiàn)的支持五筆和拼音輸入的輸入法的詳細(xì)內(nèi)容,更多關(guān)于C#支持五筆和拼音輸入的輸入法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Winform ComboBox如何獨(dú)立繪制下拉選項(xiàng)的字體顏色
這篇文章主要介紹了Winform ComboBox如何獨(dú)立繪制下拉選項(xiàng)的字體顏色,幫助大家更好的理解和使用c# winform,感興趣的朋友可以了解下2020-11-11
C# WinForm實(shí)現(xiàn)Socket異步通訊的步驟詳解
Socket通訊是網(wǎng)絡(luò)編程中非常基礎(chǔ)且重要的一部分,它為應(yīng)用程序提供了基于TCP/IP協(xié)議進(jìn)行數(shù)據(jù)傳輸?shù)哪芰?本文將詳細(xì)介紹如何在C#的WinForm應(yīng)用程序中實(shí)現(xiàn)Socket的異步通訊,希望能為有需要的開(kāi)發(fā)提供一些參考,需要的朋友可以參考下2025-07-07
C#實(shí)現(xiàn)IP代理池調(diào)度的示例代碼
這篇文章主要為大家介紹了C#實(shí)現(xiàn)IP代理池調(diào)度的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的參考與學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-07-07
C#結(jié)合Spire.Doc?for?.NET實(shí)現(xiàn)將XML轉(zhuǎn)為PDF
可擴(kuò)展標(biāo)記語(yǔ)言(XML)文件是一種標(biāo)準(zhǔn)的文本文件,它使用自定義標(biāo)簽來(lái)描述文檔的結(jié)構(gòu)及其他特性,本文將演示如何使用?Spire.Doc?for?.NET?在?C#?和?VB.NET?中實(shí)現(xiàn)?XML?到?PDF?的轉(zhuǎn)換,有需要的可以了解下2026-03-03
C#中限制并發(fā)任務(wù)數(shù)量的高效方法與技巧分享
在C#中,處理并發(fā)操作是一項(xiàng)常見(jiàn)且強(qiáng)大的功能,尤其是在需要執(zhí)行多個(gè)任務(wù)但又希望限制同時(shí)運(yùn)行任務(wù)數(shù)量的場(chǎng)景中,本文將深入探討幾種有效的方法來(lái)限制C#中的并發(fā)任務(wù)數(shù)量,并通過(guò)具體的應(yīng)用場(chǎng)景和示例代碼展示如何實(shí)現(xiàn)這些方法,需要的朋友可以參考下2024-12-12

