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)
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)
Respostas:
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}}
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()