我希望能够支持自定义 Windows 控件中的文本输入,就像 EDIT 和 Rich Edit 控件已经做的那样,但不对其中任何一个控件进行子类化。该控件当前使用 Direct2D 和 DirectWrite 绘制文本,并在带有平台更新的 Windows Vista SP1 或更高版本上运行(如果我决定需要更新的 Direct2D 和 DirectWrite 功能,我可能会将其更改为带有平台更新的 Windows 7 SP1 或更高版本,假设这些功能是在那里可用或仅在 Windows 8 上可用,但这是另一个问题......)
就其价值而言,在 OS X 上我会使用NSTextInputClient https://developer.apple.com/reference/appkit/nstextinputclient?language=objc在 GTK+ 上我会使用GtkIMContext https://developer.gnome.org/gtk3/stable/GtkIMContext.html。我正在谈论的就是这样的事情。
显而易见的选择是使用WM_CHAR
,如果我正确收集的话,如果窗口类注册为 UTF-16,那么它本身就是 UTF-16RegisterClassW()
,因此无论位置如何都应该“正常工作”。然而,WM_CHAR
是由生成的TranslateMessage()
, and 它的文档 https://msdn.microsoft.com/en-us/library/windows/desktop/ms644955(v=vs.85).aspx说没有办法确定是否WM_CHAR
已生成或未生成,因为TranslateMessage()
始终返回非零值。我需要能够确定当前的键盘消息是否将由文本系统处理(因此应该被忽略);这尤其正确,因为所有非文本键都需要以独立于布局的方式处理(我已经有了)。
我还在 Windows 7 示例代码中看到了 IMM API 和文本服务框架。我不确定一个是否比另一个更好,而且他们似乎都做同样的事情。他们有吗?
就 IMM 而言,有许多WM_IMM_xxx
我不确定是否应该忽略这些消息,并且我发现的每个参考文献似乎都不同意我是否应该在 Unicode 窗口中处理它们......此外,上面的问题是知道是否给定的按键事件是否由 IMM 处理仍处于开放状态;有办法吗?
TSF 有一个称为 ACP 的概念,它似乎允许我使用任何我想要的文本存储格式来存储我实际要使用的文本(即,不是正在进行的合成)。这是真的?我希望能够将文本存储为带有属性的 UTF-8,在绘图时转换为 UTF-16(对于 DirectWrite)。其他 API 选择也可以让我这样做吗?
或者我完全走错了路?
而我又该如何opt https://msdn.microsoft.com/en-us/library/windows/desktop/jj126268(v=vs.85).aspx into https://blogs.msdn.microsoft.com/oldnewthing/20150601-00/?p=45481 the https://blogs.msdn.microsoft.com/oldnewthing/20150608-00/?p=45431 屏幕键盘 https://stackoverflow.com/questions/38774139/show-touch-keyboard-tabtip-exe-in-windows-10-anniversary-edition#comment64922814_38774139一旦我做了所有这些?
我使用的其他参考资料:
- http://www.catch22.net/tuts/unicode-text-editing http://www.catch22.net/tuts/unicode-text-editing
Thanks.
UPDATE2016 年 11 月 7 日
再次查看 TsfPad 示例后,我注意到它似乎也只是使用WM_CHAR
;现在我不确定它是如何使用 TSF 的,除此之外......