Pregunta

A partir de la API de Win32 nativo usando C ++ hay una manera de determinar si la ventana asociada con un HWND sigue siendo válida?

¿Fue útil?

Solución

Se podría utilizar la API de Win32 IsWindow .

No se recomienda para utilizarlo aunque por 2 razones:

  1. manijas de Windows puede ser reutilizado una vez que la ventana se destruye, por lo que no sabe si tiene un identificador para una ventana totalmente diferente o no.
  2. El estado podría cambiar directamente después de esta llamada y usted pensará que es válida, pero en realidad no puede ser válida.

Desde MSDN (mismo enlace como anteriormente):

  

Un hilo no debe usar IsWindow para una   ventana que no creó porque   la ventana puede ser destruida después   esta función se llama. Promover, adicional,   porque identificadores de ventana se reciclan   el mango incluso podría apuntar a una   diferente de la ventana.

¿Qué se puede hacer?

Tal vez su problema puede ser rediseñado de manera que usted no tiene la necesidad de comprobar si hay un identificador válido. Tal vez, por ejemplo, se puede establecer una tubería desde el cliente al servidor.

También podría crear un enlace de Windows para detectar cuando se producen ciertos mensajes, pero esto es algo excesivo para la mayoría de las necesidades.

Otros consejos

Esta pregunta es viejo, pero necesitaba esta funcionalidad mí mismo y era un poco decepcionado después de leer acerca de las advertencias. Sin embargo, después de hacer un poco más de excavación parece que todo está bien. A menos que usted está tratando con programas de 16 bits, IsWindow parece ser el camino a seguir. El problema de la manija reutilización parece haber sido suficientemente abordado de acuerdo a lo siguiente:

http://blogs.msdn.com/b/oldnewthing/archive /2007/07/17/3903614.aspx

Por lo tanto, debido a la reutilización contador de 16 bits superior, es muy poco probable que se encontrará con un problema ventana de reutilización.

Puede utilizar IsWindow () o también intentar enviar un mensaje de la ventana WM_NULL con SendMessage (CVent, WM_NULL) y ver si tiene éxito.

Además, es cierto que la ventana puede ser destruida en cualquier momento si no está bajo su control. Como ya han dicho el mango potencialmente podría pertenecer a otra ventana como las asas son reutilizados. En realidad no sé qué tan probable es que lo es.

La única solución que conozco la de crear un sistema de amplia gancho que busca mensajes que indican una ventana se destruye (WM_CLOSE, WM_DESTROY). De allí tendría que comparar el identificador de ventana de mensajes a los que están sosteniendo para ver si alguna de las ventanas que le interesan son afectados. Vea aquí para más información sobre el sistema de ancho ganchos.

Si el procedimiento de ventana de la ventana en cuestión está bajo su control (o si se puede subclase), entonces yo sugeriría el registro de un mensaje personalizado que responde las ventanas a un resultado distinto de cero. Enviando ese mensaje a cualquier otra ventana (o un HWND válido) dará lugar a 0.

Por supuesto, que sólo le indica si el HWND se refiere a una de las ventanas que usted controla -., Pero tal vez teniendo en cuenta otras respuestas anteriores que incluso podría ser ventajoso

Uso RegisterWindowMessage para registrar el mensaje, utilizando un nombre lo suficientemente único.

Tal vez una combinación de IsWindow, FindWindow y GetWindowThreadProcessId será más preciso

HWND windowHandle = FindWindow(NULL, TEXT("window_title"));
LPDWORD oldpid = 0;
GetWindowThreadProcessId(windowHandle, &oldpid);
//after some time
if (IsWindow(windowHandle))
{
    LPDWORD newpid = 0;
    GetWindowThreadProcessId(windowHandle, &newpid);
    if (newpid == oldpid)
    {
        //the window is still running
    }else
    {
        //the window exists but has changed
    }
}
if(IsWindow(FindWindow(NULL , TEXT("Example Window Name")))){
     // do stuff
 }

comprobará si existe la ventana y tiene el nombre apropiado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top