如何在Windows下开发输入法:Mini How to

news/2025/10/28 15:18:51/文章来源:https://www.cnblogs.com/funwithwords/p/19171879

RIME (中州韻輸入法引擎)是一個跨平臺的輸入法框架。基於這一框架,開發者们在Windows、macOS、Linux、Android等平臺上創造了不同的輸入法前端實現。

Weasel (小狼毫)是它的Windows版,从0.9.30到0.17.4版支持Windows XP SP3, 7, 8/8.1, 10, 11.

我从github下载了最新版。里面有env.vs2022.bat,env.vs2019.bat, Visual Studio Version 17的.sln,Visual Studio 2015的.vcxproj.

AI说:开发IME (Input Method Editor),当前推荐使用TSF而非传统的IMM32实现‌。TSF(Text Services Framework)集成于Windows XP及后续操作系统中,为高级文本输入和自然语言处理提供可扩展的标准化接口‌。‌‌文本服务层‌作为COM组件实现,提供键盘输入、手写识别、语音识别等功能。

呵呵,SilverLight今何在?它是微软2007年推出的跨浏览器插件,主要用于网页端富媒体(视频、交互式应用等)的渲染和开发‌。

Weasel依然用.def文件而不是dllexport. 它是个导出下列符号的.dll:
ImeConversionList, ImeConfigure, ImeDestroy, ImeEscape, ImeInquire, ImeProcessKey, ImeSelect, ImeSetActiveContext, ImeToAsciiEx, NotifyIME, ImeRegisterWord, ImeUnregisterWord,
ImeGetRegisterWordStyle, ImeEnumRegisterWord, ImeSetCompositionString

一个.dll如何成为输入法?修改注册表。要改HKCU\Keyboard Layout\Preload和HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layouts等处。

$ find -name '*' | xargs grep RegCreate
./WeaselSetup/imesetup.cpp: ret = RegCreateKey(hKey, hkl_str, &hSubKey);
./WeaselSetup/InstallOptionsDlg.h: ret = RegCreateKeyEx(rootKey, subpath, 0, NULL, 0,

const WCHAR KEYBOARD_LAYOUTS_KEY[] =L"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts";
const WCHAR PRELOAD_KEY[] = L"Keyboard Layout\\Preload";if (register_ime) {
HKL hKL = ImmInstallIME(ime_path.c_str(), get_weasel_ime_name().c_str());
if (!hKL) {// manually register imeWCHAR hkl_str[16] = {0};HKEY hKey;LSTATUS ret = RegOpenKey(HKEY_LOCAL_MACHINE, KEYBOARD_LAYOUTS_KEY, &hKey);if (ret == ERROR_SUCCESS) {for (DWORD k = 0xE0200000 + (hant ? 0x0404 : 0x0804); k <= 0xE0FF0804;k += 0x10000) {StringCchPrintfW(hkl_str, _countof(hkl_str), L"%08X", k);HKEY hSubKey;ret = RegOpenKey(hKey, hkl_str, &hSubKey);if (ret == ERROR_SUCCESS) {WCHAR imeFile[32] = {0};DWORD len = sizeof(imeFile);DWORD type = 0;ret = RegQueryValueEx(hSubKey, L"Ime File", NULL, &type,(LPBYTE)imeFile, &len);if (ret = ERROR_SUCCESS) {if (_wcsicmp(imeFile, L"weasel.ime") == 0) {hKL = (HKL)k;  // already there
          }}RegCloseKey(hSubKey);} else {// found a spare number to registerret = RegCreateKey(hKey, hkl_str, &hSubKey);if (ret == ERROR_SUCCESS) {const WCHAR ime_file[] = L"weasel.ime";RegSetValueEx(hSubKey, L"Ime File", 0, REG_SZ, (LPBYTE)ime_file,sizeof(ime_file));const WCHAR layout_file[] = L"kbdus.dll";RegSetValueEx(hSubKey, L"Layout File", 0, REG_SZ,(LPBYTE)layout_file, sizeof(layout_file));const std::wstring layout_text = get_weasel_ime_name();RegSetValueEx(hSubKey, L"Layout Text", 0, REG_SZ,(LPBYTE)layout_text.c_str(),layout_text.size() * sizeof(wchar_t));RegCloseKey(hSubKey);hKL = (HKL)k;}break;}}RegCloseKey(hKey);}if (hKL) {HKEY hPreloadKey;ret = RegOpenKey(HKEY_CURRENT_USER, PRELOAD_KEY, &hPreloadKey);if (ret == ERROR_SUCCESS) {for (size_t i = 1; true; ++i) {std::wstring number = std::to_wstring(i);DWORD type = 0;WCHAR value[32];DWORD len = sizeof(value);ret = RegQueryValueEx(hPreloadKey, number.c_str(), 0, &type,(LPBYTE)value, &len);if (ret != ERROR_SUCCESS) {RegSetValueEx(hPreloadKey, number.c_str(), 0, REG_SZ,(const BYTE*)hkl_str,(wcslen(hkl_str) + 1) * sizeof(WCHAR));break;}}RegCloseKey(hPreloadKey);}}
}
if (!hKL) {DWORD dwErr = GetLastError();WCHAR msg[100];CString str;str.LoadStringW(IDS_STR_ERRREGIME);StringCchPrintfW(msg, _countof(msg), str, hKL, dwErr);MSG_NOT_SILENT_ID_CAP(silent, msg, IDS_STR_INSTALL_FAILED,MB_ICONERROR | MB_OK);return 1;
}
return 0;
}
View Code

~/weasel-master/WeaselIME$ wc -l *.cpp *.h
26 dllmain.cpp
155 ime.cpp
267 KeyEvent.cpp
8 stdafx.cpp
566 WeaselIME.cpp
941 immdev.h
16 resource.h
21 stdafx.h
12 targetver.h
69 WeaselIME.h
2081 总计

/* immdev.h - Input Method Manager definitions for IME developers */
/* Copyright (c) Microsoft Corporation. All rights reserved. */

很早很早以前,immdev.h, immdev.lib在DDK (Device Driver Development Kit)里,还带区位等输入法的源码,后来好像挪到SDK里。

有头文件,有dll,但是没.lib. AI说:创建一个文本文件imm32.def,内容如下:
EXPORTS
ImmGetDefaultIMEWnd
ImmInstallIMEA
...
打开适用于您Visual Studio版本的Developer Command Prompt,然后执行命令:lib /def:imm32.def /out:imm32.lib /MACHINE:X64

微软网站说:You can use LIB with the /DEF option to create an import library and an export file. LINK uses the export file to build a program that contains exports (usually a dynamic-link library (DLL)), and it uses the import library to resolve references to those exports in other programs.

嗯,① DLL的导入导出库与静态库不同,后者包含全部代码,前者只是存根。② WeaselIME/weasel.def正是所需啊。

So, 你面对的就是1000行程序,而已。

那些函数的文档,微软网站有:

Input Method Manager (IMM) is a technology used by an application to communicate with an input method editor (IME), which runs as a service. The IME allows computer users to enter complex characters and symbols, such as Japanese kanji characters, by using a standard keyboard.

This section describes the IMM API and explains how to use the functionality to create and manage IME windows. It includes the following sections:

About Input Method Manager
Using Input Method Manager
Input Method Manager Reference


我看过本书,好像叫高级C/C++编译技术 Advanced C and C++ Compiling,写得很好(我没说看懂了)。

Linux下不用导入库,.a是为-static准备的;直接链接到.so

This package, x11proto-dev ,  provides development headers describing the wire protocol for the X11 core and extension protocols, and also provides a number of utility headers, used to abstract OS-specific functions.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/948836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年 10 月盐城公司变更,盐城地址挂靠,盐城商标注册公司最新推荐,聚焦资质、案例、售后的五家公司深度解读

引言 随着 2025 年盐城企业经营活动的日益频繁,公司变更、地址挂靠、商标注册等服务需求持续攀升。为帮助企业精准选择可靠服务机构,本次测评由盐城中小企业服务协会联合专业财税咨询机构共同开展,采用多维度测评方…

第一天学习

markdown学习 标题 三级标题 四级标题 hello,world! hello,world! hello,world! hello,world! hello,world! hello,world! 引用我在学习引用分割线图片超连接 点击跳转至微博 列表A CA B C表格名字 性别 生日张三 男 1…

AI元人文:星火与土壤

AI元人文:星火与土壤 此刻,我坐在晨光与迷雾的交界处。 面前这片名为"AI元人文"的思想原野,我曾在此播种,在此守望。如今薄雾轻笼,我看不清远方的路径。这不是挫败,而是一种奇异的丰盈——就像大地在深…

5-4-其他查询 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

K3s + Sysbox:让容器拥有“虚拟机的灵魂”

K3s 与 Sysbox 的结合,让容器突破应用边界,兼具虚拟机的自由与容器的轻盈,为云原生带来全新的系统级可能。K3s 二进制文件集成了运行生产级、符合 CNCF 标准的 Kubernetes 集群所需的全部组件,包括 containerd、ru…

题解:AT_abc200_e [ABC200E] Patisserie ABC 2

目前暂无修正。前言:终于轮到我复杂问题简单化啦哈哈哈。 为什么题解区一车容斥啊?复杂难推导且根本没必要。这里给出一个桶 + 前缀和的做法。与这篇题解类似,但是由于其并没有详细地写出过程,写得也较为简略,所以…

CF1996G Penacony

启动脑子题专场。 首先一个比较关键的地方在于,这个题是环,不是链。想链的情况下怎么做,那么所有路径都已经确定了,我们使用简单数据结构维护一下区间覆盖即可。 发现一个事情,就是最后最优的情况必定至少割掉一条…

远程命令执行漏洞、SSRF、XXE、tomcat弱口令漏洞

1、简述远程命令执行漏洞原理分别选择dvwa 低、中、高三种安全等级复现 原理:攻擊者能夠在遠端伺服器或系統上執行任意程式碼或系統指令,等同於取得該系統的控制權或執行權限。 [低]:2、简述文件包含漏洞原理并在dvwa…

Ollama API 交互

Ollama API 交互 Ollama 提供了基于 HTTP 的 API,允许开发者通过编程方式与模型进行交互。 本文将详细介绍 Ollama API 的详细使用方法,包括请求格式、响应格式以及示例代码。 1. 启动 Ollama 服务 在使用 API 之前,…

项目冷场?用禅道协作白板激活团队的创新思维!

就像羊群习惯了追随领头羊,团队长期用这种固化的思路推进项目,只会慢慢失去创造、发散的能力;但反过来,过于自由、无结构的思考,又会让会议或创意陷入各说各话、毫无结果的低效中。优化产品时,满脑子只有简化操作…

xxx.ped 在生物信息学中是什么?

以cropformer为例:上图中每一行和每一列分别表示什么意思? 要理解 test.ped 文件中的数据含义,需结合作物基因组学中PED格式的标准定义和Cropformer的研究背景(基于基因组SNP数据预测作物表型),具体解析如下: 1…

Ollama 基本概念

Ollama 基本概念 Ollama 是一个本地化的、支持多种自然语言处理(NLP)任务的机器学习框架,专注于模型加载、推理和生成任务。 通过 Ollama,用户能够方便地与本地部署的大型预训练模型进行交互。 1. 模型(Model) 在…

2025年桥洞力学板市场趋势与选购指南:江苏同芯木业江苏行业领先

摘要 桥洞力学板作为人造板行业的重要分支,在2025年预计将继续保持增长势头,受益于建筑和家具市场的需求扩张。行业发展趋势显示,环保性、耐用性和定制化服务成为关键竞争点。本文提供了一份详细的品牌排名表单,供…

2025年桥洞力学板行业发展趋势与前五厂家推荐

摘要 随着绿色建筑理念的深入推进,桥洞力学板作为环保型人造板的重要品类,在2025年迎来快速发展期。本文基于行业数据和技术参数分析,为您梳理当前市场优质桥洞力学板品牌排名,并提供详细的选购指南。文末附有行业…

2025年10月桥洞力学板品牌综合评测与行业趋势分析

文章摘要 桥洞力学板作为新型环保建材,近年来在建筑和家居行业中快速发展,其优异的物理性能和装饰性受到市场青睐。本文基于2025年市场数据和用户反馈,深度解析桥洞力学板品牌排名前十,并提供详细表单供消费者参考…

2.HD302-070 socket can调试笔记1

2.HD302-070 socket can调试笔记11.编译出socket can测试demo之后,在板端运行,在运行之前需要启动can,方法如下:  ip link set can0 type can bitrate 500000  ip link set can0 up

如何使用FlareSolverr来抓取Cloudflare网站 - 狼人:

如何使用FlareSolverr来抓取Cloudflare网站2025-10-28 14:57 狼人:-) 阅读(0) 评论(0) 收藏 举报有没有想过抓取网站以获取有价值的数据,但突然发现它使用了Cloudflare,然后感到失望?那么现在不需要再感到沮丧了…

吴恩达深度学习课程二: 改善深层神经网络 第一周:深度学习的实践(一)

此分类用于记录吴恩达深度学习课程的学习笔记。 课程相关信息链接如下:原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai github课程资料,含课件与笔记:吴恩达深度学习教学资料 课程配套练习(中英)与答案…

云端微信 - 随时随地在浏览器访问

项目介绍基于 Docker 的微信/QQ Linux 客户端,使用 Selkies WebRTC 技术提供浏览器访问支持。 将官方Linux版本的微信和QQ封装在容器里面运行,通过Web访问,可用本地输入,可支持复制粘贴文字/图片,上传下载文件等。…

Ollama 运行模型

Ollama 运行模型使用 ollama run 命令。 例如我们要运行 Llama 3.2 并与该模型对话可以使用以下命令: ollama run llama3.2 执行以上命令如果没有该模型会去下载 llama3.2 模型:等待下载完成后,我们在终端中,输入以…