hwnd 设置高位是否正常?

Is it normal for an hwnd to have its high bit set?

我正在将我的 HWND 传递给一个子进程,这样它就可以向我发送有关其进度的消息。有时我从未收到来自子流程的任何消息。 在调查时,我发现我传递给子进程的 GetSafeHwnd() 似乎返回了我不期望的值。

例如: 0xffffffffa5400382

基于此,我可能可以推断出我没有正确转换该值 to/from 和 int64/string。我可以解决这个问题。但是我觉得奇怪的是这个 hwnd 看起来不对?

是否存在 HWND 可以设置高位的情况?这是正常的 window,还是 hwnd 有什么特别的地方会变成这样?

我在使用 C++,这是一个基于 CDialog 的应用程序 window。

您看到的结果来自 sign extension of the handle value to a 64-bit integer. The actual handle value is 0xa5400382, because handle values are always in the 32-bit range,即使进程是 64 位!

因此您应该将 HWND 转换为 std::uint32_t 并将其转换为字符串(或相反)。

将 HWND 转换为 wstring:

HWND hwnd = GetSafeHwnd();
std::uint32_t handleValue = reinterpret_cast<std::uint32_t>( hwnd );
std::wstring handleValueStr = std::to_wstring( handleValue );

将 wstring 转换为 HWND:

try
{
    std::uint32_t handleValue = std::stoul( someString );
    HWND handle = reinterpret_cast<HWND>( handleValue );
}
catch( std::exception& e )
{
    // Handle string conversion error
}

try/catch 块是必需的,因为如果转换失败,std::stoul() 可能会抛出异常。