您所做的不是转换。您只需将hWnd 转换为指向字符串的指针。几乎总是它不会指向有效的字符串,当您尝试将其打印为字符串时会产生未定义的行为。
要正确执行此操作,您应该将 hWnd 的位设为整数,并将其作为十六进制打印到某个缓冲区,然后再显示在消息框中:
#include <sstream>
#include <cstdint>
#include <iomanip>
//.....
std::wstringstream ss;
ss << std::hex << L"0x" << std::setw(16) << std::setfill(L'0') <<
*reinterpret_cast<uint64_t*>(&hWnd) << std::endl;
MessageBox(nullptr, ss.str().c_str(), L"Hello World!",
MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);
注意事项:
1) stringstream 是 C++ 风格的 sprintf。它是str() 方法返回std::string,所以要获得一个C 风格的指针,你应该在它上面调用c_str。
2) 我没有 Windows 来检查 HWND 实际上是什么。所以请检查它的大小并使用适当的整数类型而不是uint64_t。重要的是,如果你使用的类型太宽,你会得到垃圾甚至访问冲突。一种更好的方法是使用像 here 讨论过的整数类型模板。
3) 您可能需要std::wstringstream,因为您使用的是宽字符版本的 MessageBox。
4) 装饰。 ss << *reinterpret_cast<uint64_t*>(&hWnd) 只是将原始十六进制数字打印到ss,因此要获得正确的格式,您应该对其进行微调,设置适当的填充和填充字符。例如,这将导致所有整数都打印为带有前导零的 16 位数字:
ss << std::setw(16) << std::setfill(L'0') ...
其中setw 和setfill 函数来自iomanip 标头。此外,打印0x 前缀是您的工作,而不是stringstream。也可以看看std::showbase。