Я передаю свой HWND подпроцессу, чтобы он мог отправлять мне сообщения о его ходе. Иногда я никогда не получаю никаких сообщений от подпроцесса.
Во время исследования я обнаружил, что GetSafeHwnd (), который я передаю подпроцессу, похоже, возвращает значения, которых я не ожидаю.
Например:
0xffffffffa5400382
Исходя из этого, я, вероятно, могу сделать вывод, что я неправильно преобразовываю это значение в / из строки int64 /. Я могу это исправить. Но то, что я нахожу странным, это то, что этот hwnd просто не выглядит правильно?
Существуют ли сценарии, в которых HWND может установить высокий бит? Это нормальное окно, или есть что-то особенное в hwnd, чтобы закончить так?
Я на C ++, это окно приложения на основе CDialog.
Результат, который вы видите, исходит от расширение знака из значения дескриптора в 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()
может выдать исключения, если преобразование не удастся.
Других решений пока нет …