代码之家  ›  专栏  ›  技术社区  ›  Vincent McNabb

将IME放在自定义文本框中,从控件派生

  •  7
  • Vincent McNabb  · 技术社区  · 14 年前

    我遇到的问题是IME(输入法编辑器)集成。输入法在某种程度上确实有效,但我有一些问题。我在这里列出其中一个。

    通常,使用文本框,IME结构在文本框内呈现。但是,在我的控件中,IME显示在屏幕的右下角。我试着查看其他自定义控件,包括SharpDevelop中使用的控件。然而,这也有同样的问题。输入中文、日文或韩文会导致输入法的内容出现在屏幕的右下角。

    我需要一些关于如何在我自己的文本框中实现这一点的指针,我查看了IME的windowsapi,但是函数太多了,我不知道从哪里开始。

    有什么想法吗?

    如果任何代码示例都在C++(托管/非托管)或VB.net中,那就很好了。我可以很容易地把它移过去。

    1 回复  |  直到 14 年前
        1
  •  11
  •   Community Nick Bolton    7 年前

    好吧,看起来没有多少IME专家研究StackOverflow。。。或者没人感兴趣。

    不管怎样,我想出来了。

    基本上,我必须捕获以下Windows消息:

    WM_INPUTLANGCHANGE = 0x51
    WM_KEYUP = 0x101
    WM_CHAR = 0x102
    WM_CONVERTREQUESTEX = 0x108
    WM_IME_STARTCOMPOSITION = 0x10D
    WM_IME_ENDCOMPOSITION = 0x10E
    WM_IME_COMPOSITION = 0x10F
    WM_IME_SETCONTEXT = 0x281
    WM_IME_NOTIFY = 0x282
    WM_IME_CONTROL = 0x283
    WM_IME_COMPOSITIONFULL = 0x284
    WM_IME_SELECT = 0x285
    WM_IME_CHAR = 0x286
    WM_IME_REQUEST = 0x0288
    WM_IME_KEYDOWN = 0x290
    WM_IME_KEYUP = 0x291
    

    我在陷阱里 WM_KEYUP WM_CHAR ,因为如果我在合成一个韩文字符的过程中单击某个地方,我不会得到合成消息,但是我仍然需要将该字符添加到文本框中。这是一个奇怪的行为,我不知道这是不是一个错误。

    韩语是一个非常简单的语言(我不知道如何转换汉字,因为我不知道如何使用它)。

    基本上,对于所有的语言,只要我有 WM_IME_COMPOSITION ImmGetCompositionString 在Imm32.dll中,如我在 this question

    合成字符串后,来自Windows的消息对于每个IME都是不同的。每次,我都能从 信息。

    LParam 只是 GCS_RESULTSTR ,和 WParam 将是输入的字符,我可以投到 char

    在日语中“LParam”将是 GCS_RESULTREADSTR | GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE ImmGetCompositionString 我从前面的WM\u IME\u合成消息中存储的,因为此时它将是一个空字符串。

    LParam公司 GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE . 它和日语一样,除了以前存储的 是空的,在这种情况下我需要投

    在这三种情况下,我必须确保显示的comp In progress被清除。

    WM_IME_STARTCOMPOSITION

    如果我收到 WM_IME_ENDCOMPOSITION 我清除该标志(并清除正在进行的合成字符串)。

    有时我没有收到 WM\U IME\U结束合成 ,所以我一收到就清除了我的旗帜 WM\ U字符 .


    总而言之,这是一次非常有趣的学习经历,而且还在进行中——但IME现在终于可以在我的控制下使用了!我一直工作到凌晨1点才做完。