完整的文档参考:https://docs.microsoft.com/zh-cn/windows/win32/intl/input-context


"输入上下文" 是由 IMM 维护的内部结构。 它包含有关 IME 状态的信息,并由 IME 窗口使用。 默认情况下,操作系统会创建一个输入上下文并将其分配给每个线程。 在该线程中,此默认输入上下文为共享资源,并且与每个新创建的窗口关联。

若要在 IME 中检索或设置信息,IME 感知应用程序必须首先检索与指定窗口关联的输入上下文的句柄。 应用程序通过使用 ImmGetContext 函数来检索句柄。 在对 IMM 函数的后续调用中,它可以使用检索到的句柄来检索和设置 IME 值,如组合窗口样式、撰写样式和状态窗口位置。 应用程序使用完上下文后,必须使用 ImmReleaseContext 函数发布上下文。

由于默认输入上下文是共享资源,因此应用程序对其所做的任何更改都将应用于该线程中的所有窗口。 但是,应用程序可以通过创建自己的输入上下文并将其与一个或多个线程窗口相关联,来重写此默认行为。 对应用程序特定的输入上下文所做的更改仅适用于与上下文关联的窗口。

应用程序可以通过使用 ImmCreateContext 函数来创建输入上下文。 若要将上下文分配给窗口,应用程序将调用 ImmAssociateContext 函数。 此函数返回前面关联的输入上下文的句柄。 如果应用程序尚未与窗口关联输入上下文,则返回的句柄用于默认输入上下文。 通常情况下,应用程序会保存此句柄,稍后在不再需要自定义的输入上下文时,会将其与窗口将。

输入上下文与窗口相关联后,操作系统会在窗口激活并接收输入焦点时自动选择该上下文。 输入上下文中的样式和其他信息会影响该窗口的后续键盘输入,从而确定 IME 的操作方式。

在终止之前,应用程序必须销毁任何自定义的输入上下文。 首先,应用程序使用 ImmAssociateContext 函数从线程中使用 windows 创建的任何关联中删除输入上下文。 然后,它会调用 ImmDestroyContext 函数。