Obter identificadores de janela de aplicação
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?
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;
}