为什么我的WM_UNICHAR处理程序从未调用过?

时间:2008-12-18 15:58:56

标签: c++ com unicode atl

我有一个ATL控件,我想要支持Unicode。我为WM_UNICHAR添加了一个消息处理程序:

MESSAGE_HANDLER( WM_UNICHAR, OnUniChar )

但是,由于某种原因,永远不会调用OnUniChar处理程序。

根据文档,应首先使用“UNICODE_NOCHAR”调用处理程序,如果要接收UTF-32字符,处理程序应返回TRUE。但是,正如我所说,处理程序永远不会被调用。

有什么特别需要做才能激活它吗?

3 个答案:

答案 0 :(得分:5)

您认为应该生成WM_UNICHAR消息的是什么?

如果您的代码(或ATL代码)最终调用CreateWindowW,那么您的窗口已经识别出Unicode,并且WM_CHAR消息将是UTF-16格式。

关于什么时候确切地生成WM_UNICHAR消息,文档还远未明确,但是我可以通过非常有限的方式在Google网上论坛和互联网上收集它,看起来它是由第三方应用程序发送的,而不是Windows本身,除非Window是ANSI窗口(CreateWindowA和所有)。您是否尝试过手动向窗口发送WM_UNICHAR消息以查看会发生什么?如果您收到消息,那么您的消息调度代码没有任何问题,并且没有任何事情会导致WM_UNICHAR。你也可以查看Spy ++,看看你是否收到了这条消息,但我怀疑它没有被发送。

答案 1 :(得分:0)

我今天的经验是,Spy ++在Unicode proc中没有为WM_CHAR提供正确的结果。我正在获得ASCII翻译或'?'显示在消息列表中,即使我查看Raw(未解码)参数。调试器将wParam显示为Unicode代码点。

答案 2 :(得分:-1)

void CMFCProView::OnUniChar (UINT xChar, UINT nRepCnt, UINT nFlags)
void CMFCProView::OnChar    (UINT xChar, UINT nRepCnt, UINT nFlags)

UINT(unsigned int)的范围是0到4294967295十进制(16位)。

OnChar可以做任何你想做的OnUniChar。点击英文 软键盘上的字符 A ,然后OnChar将收到0x0041。 单击CJKV一(一),然后OnChar将收到0x4E00。所以我们没有 在App中需要OnUniChar