我有一个 ATL 控件,我希望它能够识别 Unicode。我为 WM_UNICHAR 添加了一个消息处理程序:
MESSAGE_HANDLER( WM_UNICHAR, OnUniChar )
但是,出于某种原因,永远不会调用 OnUniChar 处理程序。
根据文档,应首先使用“UNICODE_NOCHAR”调用处理程序,如果您想接收 UTF-32 字符,则处理程序应返回 TRUE。但是,正如我所说,处理程序永远不会被调用。
有什么特别需要做的来激活它吗?
你在做什么你认为应该生成 WM_UNICHAR 消息?
如果您的代码(或 ATL 代码)最终调用 CreateWindowW,那么您的窗口已经支持 Unicode,并且 WM_CHAR 消息将是 UTF-16 格式。
该文档还不清楚何时生成 WM_UNICHAR 消息,但从我在 Google Groups 和 Internet 上非常有限的闲逛中收集到的信息来看,它看起来像是由 3rd 方应用程序而不是 Windows 本身发送的, 除非 Window 是一个 ANSI 窗口(CreateWindowA 等等)。您是否尝试过手动将 WM_UNICHAR 消息发送到您的窗口以查看会发生什么?如果您收到消息,那么您的消息调度代码没有任何问题,并且没有任何事情会导致 WM_UNICHAR。您还可以使用 Spy++ 检查您是否收到该消息,尽管我怀疑它只是没有被发送。
我今天的经验是 Spy++ 在 Unicode 过程中没有为 WM_CHAR 提供正确的结果。我得到 ASCII 翻译或“?” 显示在消息列表中,即使我查看原始(未解码)参数。调试器显示 wParam 是 Unicode 代码点。
void CMFCProView::OnUniChar (UINT xChar, UINT nRepCnt, UINT nFlags)
void CMFCProView::OnChar (UINT xChar, UINT nRepCnt, UINT nFlags)
UINT(无符号整数)的范围是 0 到 4294967295 十进制(16 位)。
OnChar 可以做任何你想让 OnUniChar 做的事情。单击A软键盘上的英文字符,OnChar 将收到0x0041
. 点击一个 CJKV 一(一),然后 OnChar 将收到0x4E00
. 所以我们在 App 中不需要 OnUniChar。