在 Windows 上的自定义控件中处理任意文本输入的正确、现代方法是什么? WM_CHAR?注塑机? TSF?

2024-04-07

我希望能够支持自定义 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 的,除此之外......


TSF API 是 IMM API 的超集。它也比 IMM 更新,是当前处理国际文本输入(以及其他输入机制,如手写和语音)的现代方式。

如果您使用 TSF API,则通过 API 显示文本而不是 Windows 消息(因此哪条消息的问题无关紧要)。

屏幕键盘是自动处理的,您不必担心。 (TSF 的全部目的是使您的应用程序独立于输入源。)

TSF can支持UTF-8,但是有点蛋疼;您需要将扩展​​字符标记为隐藏。使用 UTF-16 会更好,它是 TSF 的默认 API。

我所知道的有关如何向现有编辑控件添加 TSF 支持的最佳示例仍然是我在 中写的文章2007年7月 http://download.microsoft.com/download/3/A/7/3A7FA450-1F33-41F7-9E6D-3AA95B5A6AEA/MSDNMagazineJuly2007en-us.chm.

Input can仍然通过 WM_CHAR 到达(例如,如果当前输入配置文件是键盘布局),因此您也需要实现它;不过,通常情况下,您可以通过调用您的ITextStoreACP::InsertTextAtSelection https://msdn.microsoft.com/en-us/library/windows/desktop/ms538441(v=vs.85).aspx执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows 上的自定义控件中处理任意文本输入的正确、现代方法是什么? WM_CHAR?注塑机? TSF? 的相关文章

  • jQuery 输入事件在 IE 中的占位符上触发

    我有一个输入字段input绑定到它的事件 通过 jQuery 每次输入值更改时都应触发此事件 我添加了一个占位符来告诉用户此输入字段的用途 如果用户单击此输入字段input不应触发事件 该值实际上不会改变 只是占位符消失 它在 Firefo
  • 低级挂钩/SetWindowsHookEx lParam 自动重复?

    在这里阅读 Windows PC 上如何实现键盘自动重复 https stackoverflow com questions 876852 how is keyboard auto repeat implemented on a windo
  • Windows 上的 wchar_t 和 char16_t 是一样的吗?

    我有一个实例std u16string 我可以通过它吗c str 到一个 Win32 API 它期望LPCWSTR 没有任何类型的转换 例如 我可以安全地这样做吗 auto u16s std u16string u Hello SetWin
  • 在 C# 中根据鼠标点击获取活动窗口名称

    我正在尝试使应用程序获取用户单击的窗口的鼠标单击位置和标题 名称 我目前使用的是 LowLevelMouseProc 它提供了良好的结果 但每当我单击 Google chrome 时 它 都会使应用程序崩溃 这是代码 using Syste
  • 如何制作复选按钮? (带有标签的隐藏复选框作为按钮:仅限 CSS)

    Using 方法1 创建可点击标签 https stackoverflow com a 6293626 1326147 用 CSS 隐藏复选框 https stackoverflow com a 18078908 1326147 and 使
  • 如何在 Windows 上查找当前系统缓存大小?

    到处搜索 但未能找到 API 调用来检索 Windows 上 文件 系统缓存的当前大小 全局内存状态Ex https stackoverflow com a 2017659 450917 检索总计 免费 已用和交换统计数据 获取系统文件缓存
  • WINAPI/DWMAPI 不规则形状的模糊窗口

    注意 这不是关于无边框窗口的问题 因此 前几天我在 Windows 7 上浏览 开始 菜单时偶然发现了这个程序 它是一个本机 Windows 程序 称为 数学输入面板 现在 我对窗户的形状很好奇 我知道它并不是完全由 DWM 绘制的 因为边
  • 监控进程的网络使用情况?

    C 或 C C Win32 中有没有一种方法可以监视某个进程的网络使用情况 显然没有您构建的应用程序 我想只监视 1 个进程大约一个小时左右 然后返回仅该进程 例如 Limewire 使用的字节 是否可以 我知道 Windows 上的 ne
  • 使用 CreateRestrictedToken(LUA_TOKEN) 从提升的进程创建低/中进程

    我正在尝试从提升的进程创建中或低完整性进程 我知道还有其他类似的问题 但它们主要关注使用资源管理器或任务计划程序等解决方法 我想坚持使用CreateRestrictedToken CreateProcessAsUser 我认为一定可以以某种
  • 如何捕获正在播放的音频?

    有谁知道如何以编程方式捕获正在播放的声音 即来自声卡的所有声音 而不是麦克风等输入设备 假设您正在谈论 Windows 则基本上可以通过三种方法来实现此目的 首先是打开音频设备的主输出作为录音源 这只有在驱动程序支持时才可能实现 尽管现在大
  • 使用 cryptoapi CryptImportKey 导入公钥时出错

    我想将公钥 blob 导入到 CSP 但发生了错误 BYTE pbData 0xEB 0x2A 0x38 0x56 0x86 0x61 0x88 0x7F 0xA1 0x80 0xBD 0xDB 0x5C 0xAB 0xD5 0xF2 0x
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • 调整大小时在窗口中绘图留下未绘制的边框

    我遇到的问题看似微不足道 但我找不到解决的方法 这里是 我有一个窗口 里面有一些图形 为了简单起见 我们假设它是一个实心绿色矩形 填充了窗口的整个客户区域 我希望每次窗口改变大小时都重新绘制这个矩形并填充整个窗口 我最初做的就是这样的 我已
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 如何在Delphi中显示Vista风格的气球提示?

    在输入验证时 我使用气球提示而不是消息框 我的问题是 在 Vista 上 它们具有带圆角的旧 XP 样式 而不是较新的矩形外观 我尝试使用 CreateWindowEx 创建它们并且tooltips class32或使用 SendMessa
  • win32上的64位Anaconda使用32位还是64位?

    我猜答案是 32 位 但我有点困惑为什么我什至可以在 win32 中安装 Anaconda 64 我曾经在 Anaconda 64 位上工作 但我刚刚意识到我的系统是 win32 这有时会产生一些异常 例如 请参阅我为 scipy 打开的这
  • 提取证书中主题属性的所有值

    我目前正在使用CertGetNameString http msdn microsoft com en us library windows desktop aa376086 28v vs 85 29 aspx提取每个主题属性的值 如下所示
  • 如何通过单击图像预览上的“x”从文件输入中删除图像?

    我目前有一个文件输入 一旦用户上传图像 就会显示图像预览 在图像预览上 有一个 x 可以从列表中删除图像预览 单击此 x 后 有什么方法可以从输入中的文件集中删除图像吗
  • OleLoadPicturePath 是否已以非向后兼容的方式更改?

    我最近遇到一个问题 我能够在一台 PC 上将图标添加到 VB6 表单 它运行良好 但他们无法在第二台 PC 上运行 编译它 结果发现图标文件是 32 位的 包括 Alpha 通道 这就是问题所在 但令我惊讶的是 这是一个依赖于系统的功能 在
  • Windows Aero - 以编程方式禁用视觉效果

    有谁知道是否有一个 API 可以通过编程方式禁用 启用特定的 Windows 视觉效果 例如 启用透明玻璃 或 启用 Aero Peek 我指的效果是在以下位置配置的效果 系统 高级系统首选项 高级 选项卡 性能设置 自定义 我正在为 Wi

随机推荐