No Windows, como posso visualizar uma lista de todos os títulos de janelas?

3

No Windows, como posso visualizar uma lista de todos os títulos de todos os Windows que estão abertos.

(de preferência com algum identificador único como identificador)

    
por barlop 17.11.2013 / 11:02

2 respostas

2

Eu peguei o script PowerShell de Enumerando todas as janelas do Windows com uma função do PowerShell e uma função de retorno de chamada e modificou um pouco.

Imprime o nome da janela e manipula.

<#
 .Synopsis
 Enumerieren der vorhandenen Fenster
#>

$TypeDef = @"

using System;
using System.Text;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace Api
{

 public class WinStruct
 {
   public string WinTitle {get; set; }
   public int WinHwnd { get; set; }
 }

 public class ApiDef
 {
   private delegate bool CallBackPtr(int hwnd, int lParam);
   private static CallBackPtr callBackPtr = Callback;
   private static List<WinStruct> _WinStructList = new List<WinStruct>();

   [DllImport("User32.dll")]
   [return: MarshalAs(UnmanagedType.Bool)]
   private static extern bool EnumWindows(CallBackPtr lpEnumFunc, IntPtr lParam);

   [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
   static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

   private static bool Callback(int hWnd, int lparam)
   {
       StringBuilder sb = new StringBuilder(256);
       int res = GetWindowText((IntPtr)hWnd, sb, 256);
      _WinStructList.Add(new WinStruct { WinHwnd = hWnd, WinTitle = sb.ToString() });
       return true;
   }   

   public static List<WinStruct> GetWindows()
   {
      _WinStructList = new List<WinStruct>();
      EnumWindows(callBackPtr, IntPtr.Zero);
      return _WinStructList;
   }

 }
}
"@

Add-Type -TypeDefinition $TypeDef -Language CSharpVersion3

[Api.Apidef]::GetWindows() | Where-Object { $_.WinTitle -ne "" } | Sort-Object -Property WinTitle | Select-Object WinTitle,@{Name="Handle"; Expression={"{0:X0}" -f $_.WinHwnd}}
    
por 17.11.2013 / 12:27
2

Use o EnumWindows () Função de API do Windows. Ele chamará o argumento de função de retorno de chamada definido pelo aplicativo passado para ele para todas as janelas de nível superior na tela, passando o identificador de cada um, até que o retorno de chamada retorne FALSE .

Aqui está um programa de console simples do Python 2.x que eu escrevi que usa essa função (e alguns outros para determinar quais janelas podem estar realmente visíveis na área de trabalho - muitas das janelas de "nível superior" que EnumWindows() enumeram over são invisíveis - para realizar o que você deseja. Ele faz uso do módulo win32gui incluído no pacote de extensão PyWin32 para obtenha acesso à API do Windows.Isso também pode ser feito em um nível mais baixo e mais direto usando o módulo ctypes integrado, mas o PyWin32 é uma maneira mais avançada e conveniente de fazer isso, IMO.

Você poderia redirecionar a saída para um arquivo de texto ou o programa poderia ser modificado para exibir a lista em uma janela ou caixa de diálogo usando diversos módulos GUI disponíveis, incluindo o módulo de interface tk / tcl chamado Tkinter , que é padrão com a linguagem.

import sys
import win32gui

def callback(hwnd, strings):
    if win32gui.IsWindowVisible(hwnd):
        window_title = win32gui.GetWindowText(hwnd)
        left, top, right, bottom = win32gui.GetWindowRect(hwnd)
        if window_title and right-left and bottom-top:
            strings.append('0x{:08x}: "{}"'.format(hwnd, window_title))
    return True

def main():
    win_list = []  # list of strings containing win handles and window titles
    win32gui.EnumWindows(callback, win_list)  # populate list

    for window in win_list:  # print results
        print window

    sys.exit(0)

if __name__ == '__main__':
    main()
    
por 17.11.2013 / 11:46