[英]Convert HWND to Hex String in C++
在C ++中將HWND
轉換為Hex String的最佳方法是什么,我的意思是"0x"
前綴?
HWND hWnd = FindWindow(L"Notepad", L"Untitled - Notepad");
MessageBox(nullptr, LPCWSTR(hWnd), L"Hello World!", MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);
但我希望這輸出0x00000000
(假設記事本窗口未打開),但它總是返回一個空字符串。
我也嘗試了這個答案 ,但我最終還是返回0000000000000000
。
有人可以幫我轉換嗎?
要獲取十六進制數字的字符串表示形式,請將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();
}
如果需要在MessageBox中打印出結果,請使用寬字符串流:
#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
。
一個對整數有效的hackish解決方案是將類型轉換為(void *)
iE指向void類型的指針。 在當前的Microsoft編譯器上,這很好地打印前綴為0x
因為它被解釋為“地址”。
int main(){
HWND hWnd = FindWindow(L"Notepad", L"Untitled - Notepad");
std::wstringstream wss;
wss << (void*)hWnd;
MessageBox(NULL, wss.str().c_str(), L"Hello World!", MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);
}
這個技巧與Microsoft Visual C ++編譯器開箱即用。 Gcc和clang可以發出警告,如果真的有必要可以被抑制(可能是-Wint-to-pointer-cast
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.