Pergunta

Eu estou construindo um aplicativo que dado outro MainWindowHandle aplicativo que coleta informações sobre o estado da janela. Não tenho nenhum problema coletando informações sobre janelas filho, mas não pode acessar as outras janelas abertas de um aplicativo ou até mesmo os menus. Existe alguma maneira de obter todos os identificadores de janela de uma aplicação?

Foi útil?

Solução

Você poderia fazer o que Process.MainWindowHandle parece fazer: use P / Invoke para chamar a EnumWindows função, que invoca um método de retorno de chamada para cada janela de nível superior no sistema.

Em seu retorno, chame GetWindowThreadProcessId , e compará-ID do processo da janela com Process.Id; se os ids processo de correspondência, adicionar o identificador de janela para uma lista.

Outras dicas

Primeiro, você tem que começar a windowhandle de mainwindow do aplicativo.

 [DllImport("user32.dll", SetLastError = true)]
 static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

 IntPtr hWnd = (IntPtr)FindWindow(windowName, null);

Em seguida, você pode usar este identificador para obter todos childwindows:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);

private List<IntPtr> GetChildWindows(IntPtr parent)  
{  
    List<IntPtr> result = new List<IntPtr>();  
    GCHandle listHandle = GCHandle.Alloc(result);  
    try  
    {  
         EnumWindowProc childProc = new EnumWindowProc(EnumWindow);  
         EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));  
    }  
    finally  
    {  
         if (listHandle.IsAllocated)  
               listHandle.Free();  
    }  
    return result;  
}   
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top