无法检索传递给 unicode 窗口的 wchar 文本

Posted

技术标签:

【中文标题】无法检索传递给 unicode 窗口的 wchar 文本【英文标题】:Cannot retrieve wchar text passed to unicode window 【发布时间】:2021-01-02 00:36:27 【问题描述】:

我通过向 WNDCLASSEXW 和 RegisterClassExW 注册来创建一个 unicode 窗口。但是我无法将文本传递给它。

在我的窗口过程中,我无法使用 CREATESTRUCTA 或 CREATESTRUCTW lpszName 成员恢复文本。只看到第一个字母。

HWND myCustomWidgetProcedure(HWND h,UINT m,WPARAM w,LPARAM l)

    if(m == WM_CREATE)
    
      // only first letter is printed
     std::cout << ((CREATESTRUCTA*)l)->lpszName;
     std::wcout <<  ((CREATESTRUCTW*)l)->lpszName;
    
    return 0;


LPCWSTR registerMyCustomWidgetProcedureW()

 WNDCLASSEXW wc;
 wc.cbSize = sizeof(wc);
 wc.lpfnWndProc = myCustomWidgetProcedure;
 wc.lpszClassName = L"myCustomWidgetW";
 return (LPCWSTR)RegisterWindowExW(&wc);


HWND createMyCustomWidgetProcedureW(HWND parent)

 static auto wndClass = registerMyCustomWidgetProcedureW();
  return CreateWindowExW(0,wndClass, L"Text I want to display",WS_CHILD, 0,0,0,0,parent,0,0,0);

【问题讨论】:

显示窗口过程中的代码可能会有所帮助。 这种影响可能源于 ASCII 范围内的 wchar,因此是第二个字节 NUL。使用特殊的 wchar,会显示更多的字母。正如 Mark Ransom 所说,显示更多代码。 @Joop Eggen 我已经使用 std::cout 和 std::wcout 打印了字符串,结果相同。前两个字节是第一个字母和空值。其余都是垃圾值。 wc.lpszClassName = "myCustomWidgetW"; 应该给您一个编译器警告,因为您将 ANSI 字符串分配给 Unicode 指针。此外,您对RegisterWindowEx 的调用应该是RegisterWindowExW,因为您想注册一个Unicode 类。 (该行也应该生成编译器警告。您是否偶然禁用了所有警告?) @Raymond Chen 因为它与我的示例有关,它包含这些错误,因为它不是我项目的复制粘贴,而是我在手机上输入的内容来说明。然而,我通过定义 UNICODE 解决了我的问题。我正在使用minggw。知道为什么我必须在我的翻译单元中定义 UNICODE 吗? 【参考方案1】:

我解决了这个问题。即使我明确地将 W 附加到 RegisterWindow 和 CreateWindow,我仍然必须定义 UNICODE,这很糟糕。

编辑

感谢 Raymond Chen 先生,我发现我需要使用正确版本的 DefWindowProc。当我定义 UNICODE DefWindowProcW 被调用。当我尝试将 ANSI 字符串发送到窗口时,这导致了更多问题。

简而言之,确保您使用的是每个函数的正确版本。尤其是 DefWindowProc 和 CREATESTRUCT。

【讨论】:

以上是关于无法检索传递给 unicode 窗口的 wchar 文本的主要内容,如果未能解决你的问题,请参考以下文章

从char/wchar_t到TCHAR

无法使用Unicode特殊字符设置窗口文本

Unicode 支持需要 wchar_t 吗?

不能用!feof()停止读取Unicode文件

使用 WinApi 时是不是需要 wchar_t 来支持 unicode?

如何使用 Unicode 集将 std::string 传递给 CreateDirectory