有一个 2000 年的应用程序。ANSI。来源不可用。有一个 DLL 可以挂钩它的 API。但即使 DLL 创建了自己的 Unicode 窗口或对话框。标题将始终是文字问号(如果代码点位于 ANSI 代码页之外。)
它的原因是 EXE 图像有一些东西导致了这种行为。虽然我不是 100% 确定我曾经尝试过用 Unicode 标题实例化一个窗口来公平。虽然我明白这是可以做到的。
这适用于所有窗口。可以肯定的是,一个窗口类注册了 W 系列函数,并且创建的窗口使用了 W 系列和该类。我自己在明确使用 A 和 W 函数时从来没有遇到过问题。我觉得它是更好的风格。特别是与在预处理器宏中包装字符串文字相比。因此,我从不设置 Visual Studio 字符集,无论它在哪里由我决定。
当通过 DLGTEMPLATEEX(或 DIALOGEX)结构创建精致的对话框时,对话框是 Unicode,但只有标题不是。任何设置或获取文本的尝试,包括 InternalGetWindowText 都会失败。它必须与运行时版本或“清单”或类似的东西有关(如果是这样,我们可以解决这个问题。)
不涉及中间代码。事实上,我习惯于挂钩 Windows API。无论发生什么,它都是内部的。而且它确实令人沮丧,因为自定义绘制标题是一项艰巨的任务,并且有太多工具窗口无法显示标题。我们希望向用户呈现真实世界的文本,而不是文本垃圾,即使 ANSI 代码页不匹配也是如此。
已编辑:新信息。同一套程序中的另一个应用程序没有表现出这种行为。一个使用 Windows,不受影响的是全屏视频游戏。因此,这似乎排除了(这些程序的)开发环境是一个因素的可能性。因此,它必须是程序本身以某种方式启动的行为。
我认识到的一件事是 IsWindowUnicode 对于这些程序似乎不是一成不变的。一个窗口怎么可能是Unicode,后来又不是。但这也可能是上下文的。虽然有时感觉更像是永久的,但通常窗口会失去其 Unicode 状态。这只是我必须继续前进的唯一线索。也许有某种特殊的东亚 IME 系统在起作用。我观察到一个简单的Edit控件一开始就可以出Unicode,后来就不行了。仍然 Spy++ 报告带有标题栏的主 Windows 是 Unicode。
雷米回答的评论中还有更多信息。遗憾的是,他的回答似乎是一条死胡同。虽然是崇高的努力。
包括(http://forums.codeguru.com/showthread.php?419079-window-title-unicode-problem)关于在似乎是一个更典型的开发项目中出现的相同问题的讨论。