无法检索传递给 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 文本的主要内容,如果未能解决你的问题,请参考以下文章