findwindowex c++ mfc hwnd cdialog

c++ - findwindowex c#



¿Es normal que un hwnd tenga su bit alto establecido? (1)

Paso mi HWND a un subproceso para que pueda enviarme mensajes sobre su progreso. Ocasionalmente, nunca recibo ningún mensaje del subproceso. Mientras investigaba, descubrí que GetSafeHwnd () del que paso al subproceso parece devolver valores que no esperaba.

Por ejemplo: 0xffffffffa5400382

Basado en eso, probablemente pueda deducir que no estoy convirtiendo correctamente ese valor a / desde un int64 / cadena correctamente. Yo puedo arreglar eso. Pero lo que me parece extraño es que este hwnd simplemente no se ve bien?

¿Hay escenarios en los que un HWND puede tener su bit alto establecido? ¿Es esta una ventana normal, o hay algo especial sobre el hwnd para terminar así?

Estoy en C ++, esta es una ventana de aplicación basada en CDialog.


El resultado que está viendo proviene de la extensión de signo del valor del identificador a un entero de 64 bits. El valor real del identificador es 0xa5400382 , porque los valores de los manipuladores siempre están en el rango de 32 bits , ¡incluso si el proceso es de 64 bits!

Por lo tanto, debe convertir el HWND a std::uint32_t en std::uint32_t lugar y convertirlo en cadena (o al revés).

Convierta HWND a wstring:

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

Convierta wstring a HWND:

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

Se requiere el bloque try / catch porque std::stoul() puede lanzar excepciones si falla la conversión.