在C++中将 HWND 转换为十六进制字符串

Convert HWND to Hex String in C++

本文关键字:十六进制 字符串 转换 HWND C++ 中将      更新时间:2023-10-16

在C++中将HWND转换为十六进制字符串的最佳方法是什么,我的意思是也带有"0x"前缀?

HWND hWnd = FindWindow(L"Notepad", L"Untitled - Notepad");
MessageBox(nullptr, LPCWSTR(hWnd), L"Hello World!", MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);

但我希望这会输出0x00000000(假设记事本窗口未打开(,但它总是返回一个空字符串。

我也尝试过这个答案,但我最终返回了0000000000000000.

任何人都可以帮助我进行转换吗?

这个:

HWND hwnd = FindWindowW(NULL, L"Untitled - Notepad");
std::wostringstream ss;
ss << std::hex << hwnd;
std::wstring strTitle = ss.str();
MessageBoxW(NULL, L"Caption message", strTitle.c_str(), MB_OK);

若要获取十六进制数的字符串表示形式,请将0x文本后跟句柄插入字符串流中:

#include <Windows.h>
#include <sstream>
#include <iostream>
int main(){
HWND hWnd = FindWindow(L"Notepad", L"Untitled - Notepad");
std::stringstream ss;
ss << "0x" << hWnd;
std::cout << ss.str();
}

如果需要在消息框中打印结果,请使用宽字符串流:

#include <Windows.h>
#include <sstream>
int main(){
HWND hWnd = FindWindow(L"Notepad", L"Untitled - Notepad");
std::wstringstream wss;
wss << "0x" << hWnd;
MessageBox(NULL, wss.str().c_str(), L"Hello World!", MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);
}

你正在做的不是转换。您只需将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') ...

其中setwsetfill函数来自标头iomanip。此外,打印0x前缀是您的工作,而不是stringstream。也看看std::showbase.