在C++中将 HWND 转换为十六进制字符串
Convert HWND to Hex String in C++
在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') ...
其中setw
和setfill
函数来自标头iomanip
。此外,打印0x
前缀是您的工作,而不是stringstream
。也看看std::showbase
.
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 如何在C++中将十六进制字符串转换为文本数据
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- 将字符串(可以是十进制字符串或十六进制字符串)转换为整数C++
- 将 std::string( "x3BxDEx7C" ) 转换为可读的十六进制字符串?
- C++ 将十六进制字符串表示形式转换为十六进制字符串表示形式
- 字符数组到十六进制字符串的转换 - 意外输出
- C++十进制到十六进制(字符串下标超出范围)
- C++十六进制字符串转换为十六进制的字符 *
- 如何在C++中将十六进制字符串转换为字节字符串?
- 从十六进制字符串转换为十六进制字符数组
- 以C++格式将十六进制字符串转换为十进制数
- 将无符号字符 * 转换为十六进制字符串
- 在C++中将 HWND 转换为十六进制字符串
- 按位函数 AND、OR 和 XOR 在 C++ 中使用十六进制字符串
- 如何将十六进制字符串转换为 HTML 实体
- 查找十六进制字符串是 utf-8 或 utf-16
- 在 c++ 中使用字符串流将 4 个字符的十六进制字符串转换为有符号的短字符串
- 将 std::十六进制字符串转换为 std::array<T, 6>