【问题标题】:non-unicode WM_CHAR in unicode windowsunicode 窗口中的非 unicode WM_CHAR
【发布时间】:2009-04-20 15:43:34
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c++ windows winapi dll unicode


    【解决方案1】:

    问题出在消息检索过程中。我使用GetMessage() 和我的窗口句柄而不是0,GetMessageW(&msg, wnd_handle, 0, 0) 而不是GetMessageW(&msg, 0, 0, 0)
    这样,WM_INPUTLANGCHANGEREQUEST 消息就被吞掉了,语言环境仍然是英文。

    【讨论】:

      【解决方案2】:

      您的方法似乎应该有效。

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

      作为一个实验,我会直接处理WM_UNICHAR 消息,然后看看当时的数据是什么样子的。

      【讨论】:

      • 我在处理 WM_UNICHAR 时遇到了问题,经过一番搜索后我发现:“总而言之:这是一个文档错误。WM_UNICHAR 不是由 Windows 生成的。正如您所推断的那样,它是供使用的由 3rd 方应用程序。TranslateMessage 发布的有关它的段落在任何版本的 Windows 中都不是真的。 - social.msdn.microsoft.com/Forums/windowsdesktop/en-US/…
      【解决方案3】:

      我不是 100% 确定,但它可能会有所帮助:

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

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

      【讨论】:

      • 设置设置为 Unicode。 _UNICODE 预处理器指令也已设置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多