你所做的不是转换。你只是将
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
。这很重要,因为如果你使用了太宽的类型,你将得到垃圾或甚至访问冲突。更好的方法是使用像这里讨论的整数类型模板。
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
。
0x0000000000000000
,打开时返回0x0000000000xxxxxx
,但我期望它返回0x00000000
和0x00xxxxxx
。 :-) - Blueeyes789