我编写了一个DLL,它导出一个使用RegisterClassExW
和CreateWindowExW
创建窗口的函数。每条消息都通过
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
消息?
答案 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或更高版本。