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

3

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

(De preferência com algum identificador exclusivo, como identificador)

barlop
fonte
2
Há uma função da API do Windows para fazer isso chamada EnumWindows () que possui a funcionalidade principal necessária. Não conheço nenhum programa existente para fazer isso, mas você provavelmente poderia escrever um na sua linguagem de script favorita - eu pessoalmente prefiro o Python , que certamente poderia fazer algo assim. O VisualBasic provavelmente também poderia, assim como vários outros.
martineau

Respostas:

2

Peguei o script do PowerShell de Enumerando todas as janelas do Windows com uma função do PowerShell e uma função de retorno de chamada e modifiquei-o levemente.

Imprime o nome da janela e o identificador.

<#
 .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}}
Der Hochstapler
fonte
Você leu a seção sobre direitos autorais na impressão do site? Proíbe copiar, modificar e distribuir todo o conteúdo. Você deve pelo menos considerar atribuir uma justa atribuição ao autor.
ComFreek
@ComFreek: Mais justo do que criar um link para o site dos autores?
DerHochstapler #
2

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

Aqui está um programa simples de console do Python 2.x que escrevi que usa essa função (e algumas outras para determinar quais janelas podem realmente estar visíveis na área de trabalho - muitas das janelas de "nível superior" que EnumWindows()são listadas por cima são invisíveis - para realize o que você deseja.Ele usa o win32guimódulo incluído no pacote de extensão PyWin32 para obter acesso à API do Windows.Isso também pode ser feito em um nível mais baixo e direto, usando o ctypesmódulo interno, mas o PyWin32 é mais maneira avançada e conveniente de fazer isso, IMO.

Você pode redirecionar a saída para um arquivo de texto ou o programa pode ser modificado para exibir a lista em uma janela ou caixa de diálogo usando vários módulos GUI diferentes disponíveis, incluindo o módulo de interface tk / tcl chamado Tkinter, que vem de fábrica com o idioma.

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()
Martineau
fonte
uma coisa que vale a pena examinar, mas sua resposta pode ser melhor como um comentário, pois esse tipo de resposta é mais para o stackoverflow. Então, minha pergunta é olhar mais para programas já escritos que o fariam. Às vezes, as pessoas postam pedaços de vbscript. Conheço um pouco de vbscript, mas ele não tem muitas maneiras de ver as coisas. A tal ponto que, embora tenha uma função msgbox .. ou alguma caixinha que exiba informações, ela não rola .. e, portanto, a melhor maneira é fazer o programa rodar o bloco de notas e abrir o arquivo. Suponho que seja possível
barlop
Desculpa. Sugira que você edite sua pergunta para ter uma idéia mais clara do que deseja.
martineau
obrigado, eu sei um pouco de python (mais de powershell!) Eu vou dar a esta
barlop