Pergunta

A partir da API Win32 nativa usando C ++, existe uma maneira de determinar se a janela associada a um HWND ainda é válida?

Foi útil?

Solução

Você poderia usar a API Win32 Iswindow.

Não é recomendado para usá -lo por 2 motivos:

  1. As alças do Windows podem ser reutilizadas assim que a janela é destruída, para que você não saiba se tem uma alça para uma janela totalmente diferente ou não.
  2. O estado pode mudar diretamente após essa chamada e você pensa que é válido, mas pode realmente não ser válido.

De msdn (o mesmo link que acima):

Um encadeamento não deve usar o ISWindow para uma janela que não criou porque a janela poderia ser destruída após a chamada essa função. Além disso, como as alças de janela são recicladas, a alça pode até apontar para uma janela diferente.

O que pode ser feito?

Talvez o seu problema possa ser re-arquitetado para que você não precise verificar um identificador válido. Talvez, por exemplo, você possa estabelecer um tubo do cliente para o servidor.

Você também pode criar um gancho do Windows para detectar quando determinadas mensagens ocorrem, mas isso provavelmente é um exagero para a maioria das necessidades.

Outras dicas

O SharePoint não fornece uma maneira fora da caixa de fazer isso usando grupos do SharePoint.

Eu não conheço sua estrutura do Active Directory, mas é provável que você tenha grupos correspondentes já definidos lá.Esses grupos podem ser adicionados aos sites da equipe então.Se algo for alterado no Active Directory, isso refletirá diretamente às permissões no SharePoint.

A única desvantagem de usar grupos do Active Directory é que você não verá os membros diretamente no SharePoint.

Para mais informações, por favor, dê uma olhada no blog Kirk Evans:

Esclarecimento de orientação sobre grupos de segurança do SharePoint versus grupos de serviços de domínio do Active Directory

Você pode usar Iswindow () ou também tente enviar à janela uma mensagem wm_null com Enviar mensagem(hwnd, wm_null) e veja se é bem -sucedido.

Além disso, é verdade que a janela pode ser destruída a qualquer momento, se não estiver sob seu controle. Como outros afirmaram, a alça pode pertencer a outra janela à medida que as alças são reutilizadas. Na realidade, não sei como isso é provável.

A única solução que eu conheço para criar um sistema em largura gancho Isso procura mensagens indicando que uma janela é destruída (wm_close, wm_destroy). Em seguida, você compararia o identificador da janela da mensagem com aqueles que você está segurando para ver se alguma das janelas que você se importa são afetadas. Veja aqui para obter mais informações sobre ganchos amplos do sistema.

Se o procedimento da janela para a janela em questão estiver sob seu controle (ou se você puder subclassá-lo), sugiro registrar uma mensagem personalizada à qual a janela responda com um resultado diferente de zero. O envio dessa mensagem para qualquer outra janela (ou um HWND inválido) resultará em 0.

Obviamente, isso diz apenas se o HWND se refere a uma das janelas que você controla - mas talvez dadas outras respostas acima que podem até ser vantajosas.

Use RegisterWindowMessage para registrar a mensagem, usando um nome suficientemente exclusivo.

Talvez uma combinação de IsWindow, FindWindow e GetWindowThreadProcessId será mais 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
 }

verificará se a janela existe e tem o nome apropriado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top