Vin*_*abb 8 .net c# custom-controls ime winforms
我在C#.net 3.5中创建了自己的单行文本框控件
我从头开始写这个,包括我自己的选择代码,滚动,复制/粘贴等.它甚至可以选择从左到右的文本,而不是我曾经使用过的...
我遇到的问题是与IME(输入法编辑器)集成.IME在某种程度上确实有效,但我遇到了一些问题.我在这里列出其中一个.
通常,使用TextBox,IME构造将在TextBox中呈现.但是,在我的控制中,IME显示在屏幕的右下角.我尝试查看其他自定义控件,包括SharpDevelop中使用的控件.但是,这也存在同样的问题.键入中文,日文或韩文导致IME的内容在屏幕的右下角完成.
我需要一些关于如何在我自己的文本框中完成此操作的指针,我查看了Windows API for IME,但是有很多功能,我不知道从哪里开始.
那么,有什么想法吗?
如果任何代码示例都在C++(托管/非托管)或VB.net中,那就没问题.我可以轻松地移动它.
Vin*_*abb 10
好吧,看起来StackOverflow上没有很多IME专家......或者没人感兴趣.
无论如何,我想通了.
基本上,我必须捕获以下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
Run Code Online (Sandbox Code Playgroud)
我诱捕WM_KEYUP和WM_CHAR,因为如果我在合成韩语字符的中间某处点击,我没有得到一个组成消息,但我需要这个角色添加到我的文本框仍然.这是一种奇怪的行为,我想知道它是不是一个bug.
一旦发生这种情况,韩国人,中国人和日本人之间会有不同的行为.
韩语是一个非常简单的(我不确定韩国转换,因为我不知道如何使用它).
基本上,对于所有语言,每当我得到一个WM_IME_COMPOSITION,我必须调用ImmGetCompositionStringImm32.dll,正如我在回答这个问题时所描述的那样.然后我将其显示为正在进行的合成,但不要将其添加到我存储的文本中.
当一个字符串被合成时,来自Windows的消息对于每个IME是不同的.每一次,我都可以从WM_IME_COMPOSITION消息中得到它.
在韩语中,LParam将只是GCS_RESULTSTR,并且WParam将成为我输入的角色char
在日语'LParam'将是GCS_RESULTREADSTR | GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE.我必须使用ImmGetCompositionString我之前的WM_IME_COMPOSITION消息中存储的结果,因为此时它将是一个空字符串.
在中文里,LParam会的GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE.它与日语相同,除非先前存储的ImmGetCompositionString是空的,在这种情况下我需要转换WParam为char.
在所有三种情况下,我必须确保我正在显示的正在进行的补偿被清除.
如果我收到WM_IME_STARTCOMPOSITION,我设置一个合成标志(并显示正在进行的合成字符串)
如果我收到WM_IME_ENDCOMPOSITION我清除该标志(并清除正在进行的合成字符串).
有时我没有收到WM_IME_ENDCOMPOSITION,所以我在接收时清除了我的旗帜WM_CHAR.
总而言之,这是一次非常有趣的学习体验,而且还在进行中 - 但IME现在可以在我的控制下使用了!我一直工作到凌晨1点才能完成它.
| 归档时间: |
|
| 查看次数: |
4636 次 |
| 最近记录: |