gpt4 book ai didi

winapi - 如何以编程方式操作 DLGTEMPLATE?

转载 作者:行者123 更新时间:2023-12-01 07:49:54 26 4
gpt4 key购买 nike

什么?

我有一个从资源 DLL 加载的 DLGTEMPLATE,如何以编程方式在运行时更改分配给控件的字符串?

我希望能够在创建对话框之前执行此操作,这样我就可以知道显示的字符串来自资源 DLL,而不是初始化对话框时对 SetWindowText 的调用。

谷歌已经找到了在代码中创建 DLGTEMPLATE 的例子,或者摆弄简单的样式位,但没有在内存中编辑字符串。

如何?

我通过 Hook 对话框/属性表创建 API 来做到这一点。这使我可以在创建实际对话框之前以及在具有 HWND 之前访问 DLGTEMPLATE。

为什么?

我希望能够进行运行时本地化和本地化测试。我已经为加载字符串(包括 MFC 7.0 包装器)、菜单和加速器表实现了这个,但我正在努力处理对话框/属性表的创建。

代码示例将是完美的答案,理想情况下是一个环绕 DLGTEMPLATE 的类,如果我制定出自己的解决方案,我会发布它。

最佳答案

您无法编辑内存中的字符串。 DLGTEMPLATE 结构是资源 dll 的相关字节的直接文件映射。那是只读的。

您将需要处理整个 DLGTEMPLATE 结构并用更改后的长度字符串写出一个新结构。

坦率地说,与构建 DLGTEMPLATE 编写器相比,通过与控件交互来 Hook WM_INITDIALOG 并更改字符串会更容易。因为周围的人不多。除非您有额外的要求将更改的对话框资源作为原始 .res 文件实际保存到磁盘(或尝试就地修改 .dll),否则我真的建议您避免这种方法。

你说你已经在为加速器表和菜单字符串做这件事——如果你能保证修补的字符串会更短,那么只需制作 DLGTEMPLATE 结构的二进制副本,并编写查找所需的非平凡扫描代码每个字符串,以便您可以将副本修补到位。

关于winapi - 如何以编程方式操作 DLGTEMPLATE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/204334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com