`

再来谈谈切换输入法以及IMM/IME

阅读更多

本文旨在对前文的遗漏之处做一个patch,继而详细和大家讨论一下输入法相关的内容,毕竟给中国人用的程序难免会遇到打字的需求,提到打字必然会遇到输入法。

 

首先是对前文的一个补遗,如果你直接copy前文的代码执行可能会发现本没有出现想象中的鼠标一点,输入法就变了,为啥呢。因为我漏掉了一个步骤,也就是对输入法状态的重置。

需要在调用ImmSetConvertionStatus前对要切换输入法的控件设置 ImeMode=ImeMode.On。

那么这个ImeMode究竟起到什么作用呢,众所周知,在winform的TextBox等控件(包括MaskedTextBox)都包含了一个ImeMode的属性,这个属性其实就是在底层调用了ImmSetConvertionStatus方法来设置输入法为指定的几个枚举值:

image

图1

image

图2

根据Reflector的结果发现其中对这个枚举进行了细化

    static ImeModeConversion()
    {
        japaneseTable = new ImeMode[] { ImeMode.Inherit, ImeMode.Disable, ImeMode.Off, ImeMode.Off, ImeMode.Hiragana, ImeMode.Hiragana, ImeMode.Katakana, ImeMode.KatakanaHalf, ImeMode.AlphaFull, ImeMode.Alpha };
        koreanTable = new ImeMode[] { ImeMode.Inherit, ImeMode.Disable, ImeMode.Alpha, ImeMode.Alpha, ImeMode.HangulFull, ImeMode.Hangul, ImeMode.HangulFull, ImeMode.Hangul, ImeMode.AlphaFull, ImeMode.Alpha };
        chineseTable = new ImeMode[] { ImeMode.Inherit, ImeMode.Disable, ImeMode.Off, ImeMode.Close, ImeMode.On, ImeMode.OnHalf, ImeMode.On, ImeMode.OnHalf, ImeMode.Off, ImeMode.Off };
        unsupportedTable = new ImeMode[0];
    }
<!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com -->

由此,如果我们只需要设置输入法的全角半角,或者日文输入法的平假名片假名切换就只需要调用 TextBox或者类似控件的ImeMode属性就行了。不过根据Reflector得到的代码我发现其实设置ImeMode来调用ImmSetConvertionStatus的时候Sentence的值恒为0,那么也就是说如果是要切换的日语或者中文的组句特性的话就不能使用ImeMode属性而是用前文的调用win32api的方式来实现。

根据之前的讨论我们可以发现IMM和IME的关系,IMM也就是操作系统的文字服务,只有东亚版本的windows才有,而IME就是输入法的实现程序,包括微软拼音,智能ABC,五笔之类的都是IME的程序,IME注册到IMM中,由IMM来决定当前使用的IME程序,而用户不能直接和IME打交道,而只能通过IMM提供的api接口,比如我们之前用到的ImmSetConvertionStatus。典型的代理模式应用

当然IMM提供的API函数还是IME程序和IMM交互的接口,如果我们要实现自己的输入法的话就只用通过这些接口就行了。

附一:

Mode 和Setence值的含义,按位定义

|     1/0    |   1/0    |     1/0    |  1/0   |  1/0   |   1/0    |  1/0 |  1/0   |  1/0 |   1/0  |   1/0    |  1/0 |
|_98(me)保留_|_中文标点_|_自定义字符_|_不转换_|_软键盘_|_韩(汉字)_|_内码_|_日罗马_|_全角_|_片假名_|_本地语言_|

|    1/0   |   1/0    |   1/0    |   1/0    |   1/0    |   1/0    |
|_逐键提示_|_词语联想_|_自动模式_|_单字模式_|_多个子句_|_没有组句_|

我在上一篇中的表中, 片假名半角的mode值是19,换成2进制就是10011,查表得到的就是

内码|半角|片假名|本地语言

正好符合。

分享到:
评论

相关推荐

    IMM_IME/汉字输入法

    本文将围绕“IMM_IME/汉字输入法”这一主题,详细探讨汉字输入法的基本原理、常见类型以及编程实现技术。 首先,我们需要了解IMM_IME(Input Method Manager/Input Method Editor)的概念。IMM_IME是Windows操作...

    基于IMM_IME输入法接口的实现方法

    在提供的文件"基于IMM_IME输入法接口的实现方法.caj"中,读者可以期待找到更详细的技术实现细节,包括具体的API用法、代码示例以及可能遇到的问题与解决方案。CAJViewer是一款专门用来阅读学术期刊和文档的软件,...

    基于IMM-IME输入法接口的实现方法

    ### 基于IMM-IME输入法接口的实现方法 #### 概述 本文主要探讨了基于输入法管理器(Input Method Manager, IMM)与输入法编辑器(Input Method Editor, IME)接口的实现方法。随着中文信息技术的发展,各种输入法...

    IBM-IMM+IMM2管理口-中英文手册

    2. **初始化和配置**:指导如何设置IMM/IMM2,包括网络设置、安全选项(如密码策略)、以及如何通过Web界面或命令行工具访问。 3. **远程访问与控制**:详述如何使用KVM功能,包括虚拟控制台的启动和操作,以及如何...

    pb中自动切换输入法

    在本例中,`IME_THotKey_IME_NonIME_Toggle`常量被用来切换输入法状态,其值可以是112或16,具体取决于API的实现版本。调用此函数可以模拟用户按下某个特定的热键,从而触发输入法的切换。 2. `GetKeyboardLayout` ...

    PB切换输入法(网上找的其它方法不管用的,可以试试我的方法)

    如果两者不相等,即当前输入法不是英文,那么它会获取父窗口的句柄(`hnd`),并调用`ImmSimulateHotKey`函数来模拟切换输入法的热键操作,从而将输入法切换到英文模式。 这个方法依赖于特定的KLID值,这意味着它...

    调用文件及切换输入法(2.0)

    在C# WinForm应用开发中,"调用文件及切换输入法(2.0)"是一个重要的功能点,它涉及到用户界面交互以及系统级API的使用。在这个场景下,我们需要关注两个核心知识点:文件的调用操作和输入法的切换。 首先,让我们...

    Win32 Multilingual IME Overview for IME Development

    《Win32 多语言IME概述...Windows 98和Windows 2000的IMM/IME架构保留了Windows 95和Windows NT 4.0的设计,但做了一些改进,以适应不断发展的技术需求和用户体验。开发者需关注这些差异,确保IME在新平台上运行正常。

    vc制作windows IME输入法.visual c++

    总的来说,通过VC++制作Windows IME输入法涉及Windows API的深入理解、多线程编程、字符编码知识以及用户界面设计等多个方面。这个过程虽然复杂,但能够提供高度定制的输入体验,对提高用户体验具有重要意义。开发者...

    C#设置输入法

    Windows操作系统通过输入法引擎(IME,Input Method Engine)来支持多种语言和字符集的输入。用户可以通过任务栏的语言栏或系统设置来选择和切换不同的输入法。在C#中,我们可以通过Windows API调用来实现对这些功能...

    java 载入dll之后无法切换输入法测试工程(My Eclipse)

    在Windows系统中,输入法切换通常是通过系统API来实现的,例如 IMM32 API 或者 Windows API。当Java程序加载DLL后,可能由于DLL对系统环境或线程状态的影响,导致输入法切换功能失效。这可能是由于DLL对系统线程...

    如何在程序中切换输入法程序(

    在VB.NET中,我们可以使用`SendInput` API函数来模拟键盘操作,包括切换输入法。`SendInput`函数可以模拟各种键盘事件,如按下、释放键以及组合键。以下是`SendInput`函数的定义: ```vbnet ("user32.dll", ...

    windows输入法切换

    总的来说,“windows输入法切换”涉及到的是Windows系统如何管理和切换不同输入法的机制,以及如何通过编程接口来控制和自定义这个过程。通过深入理解这些知识点,开发者可以创建更符合用户需求的输入法应用或工具。

    IME输入法编程.pdf

    ### IME输入法编程知识点详解 #### 一、IME输入法基本原理 IME(Input Method Editor,输入法编辑器)是一种用于将用户输入的标准ASCII字符转换为特定语言字符的技术,尤其是在处理非拉丁字母语言时尤为关键。在...

    C#设置输入法程序

    4. 监听输入法状态变化:你可以通过重写`WndProc`方法并处理`WM_INPUTLANGCHANGEREQUEST`消息来捕获用户切换输入法的行为: ```csharp protected override void WndProc(ref Message m) { if (m.Msg == 0x0050) //...

    中文LINUX输入法引擎标准研究.pdf

    输入法引擎API由IMM/IME接口和Helper Manager/Helper接口两部分组成。 实际系统中,这些部件动态运行,通过接口进行交互,确保了输入法引擎在不同框架下的协同工作。这一标准化工作为Linux平台上的中文输入法开发...

    BUG IME DEMO (WPF)

    1. **输入法管理器(Input Method Manager,IMM)**:WPF通过IMM与系统级别的IME进行交互,处理用户的输入。理解IMM的工作原理是解决冲突的基础。 2. **键盘事件处理**:WPF应用通过监听键盘事件(如KeyDown和KeyUp...

Global site tag (gtag.js) - Google Analytics