Нормально ли для hwnd установить свой старший бит?

Я передаю свой HWND подпроцессу, чтобы он мог отправлять мне сообщения о его ходе. Иногда я никогда не получаю никаких сообщений от подпроцесса.
Во время исследования я обнаружил, что GetSafeHwnd (), который я передаю подпроцессу, похоже, возвращает значения, которых я не ожидаю.

Например:
0xffffffffa5400382

Исходя из этого, я, вероятно, могу сделать вывод, что я неправильно преобразовываю это значение в / из строки int64 /. Я могу это исправить. Но то, что я нахожу странным, это то, что этот hwnd просто не выглядит правильно?

Существуют ли сценарии, в которых HWND может установить высокий бит? Это нормальное окно, или есть что-то особенное в hwnd, чтобы закончить так?

Я на C ++, это окно приложения на основе CDialog.

0

Решение

Результат, который вы видите, исходит от расширение знака из значения дескриптора в 64-разрядное целое число. Фактическое значение дескриптора 0xa5400382, так как значения дескриптора всегда находятся в 32-битном диапазоне, даже если процесс 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() может выдать исключения, если преобразование не удастся.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector