簡體   English   中英

在C ++中將HWND轉換為Hex String

[英]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') ...

其中setwsetfill函數來自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM