Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将IME放入从控件派生的自定义文本框中_C#_.net_Winforms_Custom Controls_Ime - Fatal编程技术网

C# 将IME放入从控件派生的自定义文本框中

C# 将IME放入从控件派生的自定义文本框中,c#,.net,winforms,custom-controls,ime,C#,.net,Winforms,Custom Controls,Ime,我在C.NET3.5中创建了自己的单行文本框控件 我完全是从头开始写的,包括我自己的选择代码、滚动、复制/粘贴等。它甚至可以选择从左到右的文本,这不是我曾经使用过的 我遇到的问题是IME输入法编辑器集成。IME在某种程度上确实有效,但我有一些问题。我只在这里列出其中一个 通常,使用文本框,IME结构在文本框内呈现。但是,在我的控件中,IME显示在屏幕的右下角。我尝试查看其他自定义控件,包括SharpDevelop中使用的控件。然而,这也有同样的问题。输入中文、日文或韩文会导致输入法的内容出现在屏

我在C.NET3.5中创建了自己的单行文本框控件

我完全是从头开始写的,包括我自己的选择代码、滚动、复制/粘贴等。它甚至可以选择从左到右的文本,这不是我曾经使用过的

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

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

我需要一些关于如何在我自己的文本框中完成此操作的指针,我查看了IME的Windows API,但是有太多的函数,我不知道从哪里开始

有什么想法吗


< >如果在C++管理/非托管或VB.NET中有任何代码示例,则是很好的。我可以很容易地移动它。

好的,看起来没有多少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
我捕获WMYKEYUP和WMYCHAR,因为如果我在合成韩文字符的中间点击某个地方,我没有得到合成消息,但是我需要把那个字符添加到我的文本框中。这是一种奇怪的行为,我想知道这是否是一种错误

一旦发生这种情况,韩国人、中国人和日本人之间就会有不同的行为

韩语是一种非常简单的语言,但我不确定韩语转换,因为我不知道如何使用它

基本上,对于所有语言,每当我获得WM_IME_组合时,我都必须调用Imm32.dll中的ImmGetCompositionString,正如我在回答中所述。然后,我将其显示为正在进行的作文,但不将其添加到存储的文本中

合成字符串后,来自Windows的消息对于每个IME都是不同的。每次,我都可以从WM_IME_合成消息中得到它

在韩语中,LParam将只是GCS_RESULTSTR,WParam将是输入的字符,我可以将其转换为char

日语中的“LParam”将是GCS|U结果STR | GCS|U结果子句| GCS|U结果TR0 | GCS|U结果原因。我必须使用从上一个WM_IME_合成消息中存储的imGetCompositionString的结果,因为此时它将是一个空字符串

在中文中,LParam将是GCS|U结果子句| GCS|U结果tr0 | GCS|U结果原因。它与日语相同,除了以前存储的imGetCompositionString为空时,在这种情况下,我需要将WParam转换为char

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

如果收到WM_IME_STARTCOMPOSITION,我将设置合成标志并显示正在进行的合成字符串

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

有时我没有收到WM_IME_ENDCOMPOSITION,所以我在收到WM_CHAR时清除了我的标志

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

刚发现,要是早点看到就好了!嗨,我正在我的WPF应用程序中做AddHook,并提供Wndproc。当窗口启动时,我收到WM_IME_上下文消息,我捕获该消息并尝试关闭默认的OS IME组合窗口,方法是将0传递给LPRAM,然后调用本机DefWindowProc,但什么也没发生。带有绿色箭头的IME合成输入ui仍会显示。你可以发布一个关于你是如何在线制作的片段吗?