Domanda

Da nativo Win32 API utilizzando C++ c'è un modo per determinare se la finestra associata con un HWND è ancora valida?

È stato utile?

Soluzione

È possibile utilizzare l'API Win32 IsWindow .

Non è raccomandato di utilizzarlo anche se per 2 motivi:

  1. maniglie Windows possono essere riutilizzati una volta che la finestra è distrutta, in modo da non so se si dispone di una maniglia di una finestra completamente diversa oppure no.
  2. Lo stato potrebbe cambiare subito dopo questa chiamata e si pensa che sia valida, ma non può davvero essere valido.

Da MSDN (stesso link come sopra):

  

Un thread non dovrebbe usare per un IsWindow   finestra che non ha creato perché   la finestra potrebbe essere distrutto dopo   questa funzione è stato chiamato. Ulteriore,   perché martelline vengono riciclati   la maniglia potrebbe anche indicare un   diversa finestra.

Cosa si può fare?

Forse il problema può essere riprogettato in modo che non si ha la necessità di verificare la presenza di un handle valido. Forse per esempio, è possibile stabilire un tubo dal client al server.

Si potrebbe anche creare un gancio finestre per rilevare quando si verificano determinati messaggi, ma questo è probabilmente eccessivo per la maggior parte delle esigenze.

Altri suggerimenti

Questa domanda è vecchia, ma avevo bisogno di questa funzionalità me stesso ed è stato un po 'deluso dopo aver letto i caveat. Tuttavia, dopo aver fatto un po 'più di scavo sembra che tutto va bene. A meno che non hai a che fare con i programmi a 16 bit, IsWindow sembra essere la strada da percorrere. Il problema della maniglia riutilizzo sembra essere stato sufficientemente analizzati secondo questa:

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

Quindi, a causa del contatore 16bit riutilizzo superiore, è altamente improbabile che si incorrerà in un problema finestra di riutilizzo.

È possibile utilizzare IsWindow () o anche tentare di inviare alla finestra un messaggio WM_NULL con SendMessage (hWnd, WM_NULL) e vedere se è successo.

Inoltre, è vero che la finestra potrebbe essere distrutto in qualsiasi momento se non è sotto il vostro controllo. Come altri hanno detto manico potrebbe potenzialmente appartenere a un'altra finestra mentre le maniglie vengono riutilizzati. In realtà io non so come probabile che sia.

L'unica soluzione che io sappia il per creare un sistema di vasta che cerca messaggi che indicano una finestra viene distrutto (WM_CLOSE, WM_DESTROY). Poi si dovrebbe confrontare la maniglia della finestra messaggio a quelli che hai in mano per vedere se una qualsiasi delle finestre che ti interessano sono interessati. Vedi qui per maggiori informazioni su ampi ganci di sistema.

Se la procedura di finestra per la finestra in questione è sotto il vostro controllo (o se si può creare una sottoclasse di esso), allora vorrei suggerire la registrazione di un messaggio personalizzato che la finestra risponde con un risultato diverso da zero. L'invio di un messaggio che a qualsiasi altra finestra (o un invalido HWND) si tradurrà in 0.

Naturalmente, che ti dice solo se il HWND si riferisce a una delle finestre che si controlla -. Ma forse dato altre risposte di cui sopra, che potrebbe anche essere vantaggioso

Usa RegisterWindowMessage per registrare il messaggio, utilizzando un nome sufficientemente originale.

Forse una combinazione di IsWindow, FindWindow e GetWindowThreadProcessId saranno più accurate

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
 }

verificherà se esiste la finestra e ha il nome appropriato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top