3

В Windows, как я могу просмотреть список всех названий всех открытых Windows.

(Желательно с некоторым уникальным идентификатором, например дескриптором)

2 ответа2

2

Используйте функцию EnumWindows() Windows API. Он будет вызывать определяемый приложением аргумент функции обратного вызова, переданный ему для всех окон верхнего уровня на экране, передавая ему дескриптор каждого из них, пока обратный вызов не вернет FALSE .

Вот простая консольная программа на Python 2.x, которую я написал, которая использует эту функцию (и несколько других, чтобы определить, какие окна действительно могут быть видны на рабочем столе - многие из окон «верхнего уровня», которые EnumWindows() , невидимы - выполнить то, что вы хотите. Он использует модуль win32gui включенный в пакет расширения PyWin32 , чтобы получить доступ к API Windows. Это также можно сделать на более низком, более прямом уровне, используя встроенный модуль ctypes , но PyWin32 - более продвинутый и удобный способ сделать это, IMO.

Вы можете перенаправить вывод в текстовый файл, или программа может быть модифицирована для отображения списка в окне или диалоговом окне, используя несколько различных доступных модулей GUI, включая интерфейсный модуль tk/tcl под названием Tkinter , который входит в стандартную комплектацию языка.

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()
2

Я взял сценарий PowerShell из Перечисления всех Windows-окон с помощью функции PowerShell и функции обратного вызова и немного изменил его.

Он печатает имя окна и дескриптор.

<#
 .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}}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .