unicode窗口中的非unicode WM_CHAR

时间:2009-04-20 15:43:34

标签: c++ windows winapi dll unicode

我编写了一个DLL,它导出一个使用RegisterClassExWCreateWindowExW创建窗口的函数。每条消息都通过

检索
GetMessageW(&msg, wnd_handle, 0, 0);
TranslateMessage(&msg);
DispatchMessageW(&msg);

还有一个加载DLL并调用函数的程序。

尽管使用了Unicode窗口创建方法,但wParam消息中的WM_CHAR始终包含ASCII字符,即使我键入了一些非ASCII符号或使用Alt +(代码)。 wParam代替UTF-16,在'A'和'z'之间包含一些ASCII字符。 WndProc是DLL中的静态函数。

当所有与窗口相关的代码都在一个程序中时,不会发生此问题。

有没有办法在DLL的窗口内始终有Unicode WM_CHAR消息?

3 个答案:

答案 0 :(得分:4)

问题出在消息检索过程中。我使用GetMessage()和我的窗口句柄而不是0 GetMessageW(&msg, wnd_handle, 0, 0)而不是GetMessageW(&msg, 0, 0, 0)
通过这种方式,吞下WM_INPUTLANGCHANGEREQUEST条消息,并且语言环境保持英语。

答案 1 :(得分:2)

您的方法似乎应该有效。

您是否可能正在调用ANSI DefWindowProc而不是宽版本?这会将WM_UNICHAR转换为ANSI WM_CHAR消息。也许这可以解释你所看到的。

作为一项实验,我会直接处理WM_UNICHAR消息,并查看此时的数据。

答案 2 :(得分:0)

我不是百分百肯定,但它可能会有所帮助:

查看实现调用DLL函数的代码的项目设置。确保字符集也是UNICODE,而不是多字节:

(转到“项目属性”,然后转到“常规”部分,并将“字符集”选项设置为“使用Unicode字符集”)。我假设您使用的是Visual Studio 2003或更高版本。