C++11(及现代C++风格)和快速迭代式开发 – 刘未鹏 | Mind Hacks
《C++ Primer Plus》(第6版)
IME输入法编程心得 - FreedomShe - 博客园
https://www.cnblogs.com/freedomshe/archive/2012/11/30/ime_learning.html
解决方案:
解决方法:
1.打开该项目的“属性页”对话框。
2.单击“链接器”文件夹。
3.单击“命令行”属性页。
4.将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RWK77pu1-1598702342082)(E:\code\c++\PC平台藏文拉丁转写输入\log_img\image-20200727151936248.png)]
Requirements for IME development (Windows Store apps) - Windows app development | Microsoft Docs
https://docs.microsoft.com/zh-cn/previous-versions/windows/apps/hh967425(v=win.10)
Input Method Manager - Win32 apps | Microsoft Docs
https://docs.microsoft.com/zh-cn/windows/win32/intl/input-method-manager
输入法(IME)实现原理_LANSINE_新浪博客
http://blog.sina.com.cn/s/blog_56a388c20100004u.html
Google Code Archive - Long-term storage for Google Code Project Hosting.
https://code.google.com/archive/p/windows-config/wikis/Win32IME.wiki
微软新一代输入法框架 TSF - Text Service Framework 小小的研究_PunCha (PCH)-CSDN博客_tsf框架输入法 https://blog.csdn.net/puncha/article/details/13293665
copyliu/YIME: 一个输入法
https://github.com/copyliu/YIME
NyaRuRu/TSF-TypeLib: Type Library of Text Services Framework for .NET
https://github.com/NyaRuRu/TSF-TypeLib
TSF自定义候选词列表界面 - ShengM - 博客园 https://www.cnblogs.com/ShengM/p/5620814.html
输入法的调试方法 | 学步园 https://www.xuebuyuan.com/691828.html
基于文本服务框架的拼音输入法研究与实现_fishmai的专栏-CSDN博客_基于文本服务框架的拼音输入法研究与实现 https://blog.csdn.net/fishmai/article/details/60756753
Text Services Framework (Text Services Framework) - Win32 apps | Microsoft Docs
https://docs.microsoft.com/en-us/windows/win32/tsf/text-services-framework
Google Translate
https://translate.google.co.uk/translate?hl=en&sl=ja&tl=zh-CN&u=https%3A%2F%2Fnyaruru.hatenablog.com%2Fentry%2F20070325%2Fp1&prev=search&sandbox=1
win10自带的notepad不能用于输入法的调试,会不加载dll,原因未知。使用notepad++可以直接单步进入代码调试。
要开启启动本地代码调试,加载符号。
这里留个效果图。
以下GUID用于标识预定义语言栏项目。这些数值通过GetItem函数,用来 获取特殊的的语言栏项。
MSDN
在 项目属性(Properties)上右键,添加=>新建项 选择“应用程序清单文件(仅限Windows)” 然后单击 添加 按钮
添加后,默认打开app.manifest文件,将:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
修改为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
重新生成项目。调试运行时就会提示需要以管理员权限运行。
添加[STAThread]在Main上。
MSDN上是这样解释的:
在主入口上应用这个特性(在C#和VB中为Main函数)。在其他方法上应用没有任何效果。为了在你代码中启动的线程中设置单元状态,请在线程开始前调用Thread.SetApartmentState 或者 Thread.TrySetApartmentState
语言支持列表:
[MS-LCID]: Appendix A: Product Behavior | Microsoft Docs
https://docs.microsoft.com/zh-cn/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c
为服务器应用选择 .NET Core 或 .NET Framework | Microsoft Docs
https://docs.microsoft.com/zh-cn/dotnet/standard/choosing-core-framework-server
在 Windows 上安装 .NET Core | Microsoft Docs
https://docs.microsoft.com/zh-cn/dotnet/core/install/windows?tabs=netcore22
.NET Framework 系统要求 | Microsoft Docs
https://docs.microsoft.com/zh-cn/dotnet/framework/get-started/system-requirements
TIP:好像有时候调试的用的编辑器会被玩坏掉,换一款试试看。
事件需要在Active内注册监听。
注册服务均可以从ITfThreadMgr中获得。获得到的对象需要使用Marshal.ReleaseComObject函数来释放。
键盘事件需要通过 ITfKeystrokeMgr.AdviseKeyEventSink 注册。
ITfSource.AdviseSink可以注册通知监听。包含:
IID_ITfActiveLanguageProfileNotifySink
IID_ITfDisplayAttributeNotifySink
IID_ITfKeyTraceEventSink
IID_ITfPreservedKeyNotifySink
IID_ITfThreadFocusSink
IID_ITfThreadMgrEventSink
输入法算法实现:隐马尔可夫模型、2-Gram的模型、云端3-Gram的语言模型
System.Runtime.InteropServices.COMException (0x80040201): 事件无法调用任何订户 (异常来自 HRESULT:0x80040201)
很是疑惑,待解决。
此外系统自带的记事本只触发OnTestKeyDown、OnTestKeyUp这两个函数,而用Typora测试的时候,就只触发OnKeyDown、OnKeyUp这两个函数,暂且不知道这俩对区别。
【更正】2020年8月19日 OnTestKeyDown OnTestKeyUp 下pfEaten返回true,才会调用对应的OnKeyDown。
异常转换为ManagerReturnValues 对象以后,显示的错误为TF_E_NOLOCK:The cookie in ec is invalid.
【重要】 EditSession 的EditCookie仅仅只在DoEditSession函数体内有效,出了该函数体范围以后,文档将解除锁定,session已经失效且无法再使用。
var keystrokeMgr = _threadMgr as ITfKeystrokeMgr;
if (keystrokeMgr == null)
return false;
与
if (!(_threadMgr is ITfKeystrokeMgr keystrokeMgr))
return false;
等价,且均为同一个实例。不需要使用Marshal.ReleaseComObject(keystrokeMgr);
释放,否则会出现System.Runtime.InteropServices.InvalidComObjectException:“COM 对象与其基础 RCW 分开后就不能再使用。”
错误。
public HRESULT OnTestKeyDown(ITfContext pic, UIntPtr wParam, IntPtr lParam, out bool pfEaten)
传入的ITfContext实例 与 var res = _threadMgr.GetFocus(out var documentMgr);res = documentMgr.GetTop(out var context);
返回context地址一样,均指向同一个实例。
候选词引擎分为两部分:拉丁字母输入、候选词列表和用户词典。
感觉之前设计的候选词引擎不太对,这次用暴力实现实现,查询就用LINQ语句暴力查。
候选词引擎分为两部分:拉丁字母输入、用户词典。
2020年8月28日 重新设计
嗯,让KeyEventSink承载输入管理器功能。
KeyEventSink:
输入状态分为英文输入模式、藏文输入模式。当处于英文输入模式的时候,不捕获任何字符。按下shift切换。
藏文输入模式又分为正常模式、组词模式:
当处于正常模式下,按下藏文的拉丁转写字母,则进入组词模式;如果按下其他按钮,则输出对应的藏文字符。
当处于组词模式下,按下拉丁按键,填入拉丁字母输入器。
当按下拉丁按钮以后,送入正确的拉丁字母串送入用户词典查询。
捕获所有的标点符号按键,f
为音节点,[
为候选词上翻页,]
为候选词下分页。方向按键←
为左选择候选词,方向按键→
为右选择词,默认选择第一个。
按下空格选择当前词或者按下数字选择词,并从拉丁输入器删除词长度的拉丁字母。每次送入词自动压入栈,如果按下删除键,则回退之前组词。如果拉丁输入器里面没有拉丁字母,则代表组词结束。把词压入用户字典。如果拉丁输入器只剩下错误字符,如果再次按下回车,则把拉丁字母直接送出到宿主。
按下回车或者shift
把拉丁字母直接送出到宿主。按下shitf的时候并进入英文输入模式。