为什么Unicode Windows标题栏(仅)是问号(?)代码点?

时间:2013-11-02 00:07:33

标签: windows winapi unicode titlebar

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)关于同样问题的讨论,这个讨论似乎是一个更典型的开发项目。

2 个答案:

答案 0 :(得分:3)

您的DLL可能正在创建Unicode窗口,但如果它没有运行自己的消息循环来为这些窗口提供服务,那么它们将由应用程序的现有消息循环提供服务,这些消息循环仍在使用Ansi API(GetMessageA()DispatchMessageA()等,因此Unicode数据将被转换为Ansi,它将丢失无法转换为Ansi的Unicode字符。这与EXE图像,清单,预处理器等无关。

答案 1 :(得分:3)

快乐的结局。

我注意到导入了SetWindowsHookExA。似乎EXE使用第三方静态库,使用WH_CBTWH_MSGFILTER挂钩设置后门,基本上为Windows添加了一个额外的图层样式对话框,并可能以一种方式提供客户端代码不处理常规的Win32消息传递框架...这可以推断,因为如果这些钩子被切断,应用程序基本上就会死掉。

我希望我能识别出安装这些挂钩的产品。但到目前为止,我只能确认绕过它们会恢复Unicode标题功能。

这似乎是一个模糊不清的问题。但我认为可能有其他人会觉得这很有用,如果这个问题的评分不低于0(我坦白地说我不明白为什么0不是最低价)我会很感激

这是实际的解决方案。虽然其他答案是值得深思的。另外,将SetWindowLong [Ptr]添加到需要使用W种类的API列表中。事实上,上面提到的其他API在这种特殊情况下似乎并不重要,但比抱歉更安全。