Что нового

Окна, Диалоги Как получить список только видимых не системных окон

pvnn

Осваивающий
Сообщения
305
Репутация
32
Необходимо получить список только видимых и не системных окон. Win10

У меня, кроме нужных, возвращаются лишние окна, например:
Microsoft Text Input Application
Program Manager
Найти

Код:
#include <Array.au3>

_ArrayDisplay(_GetOpenWindows())

Func _GetOpenWindows()
    Local $aWindows[1][3]=[[0]]
    $hWinActive=WinGetHandle("[ACTIVE]") ; Активное окно
    Local $aList = WinList() ; Массив всех окон
    For $i=1 To $aList[0][0]
        If $aList[$i][0] = '' Then ContinueLoop ; Окна без заголовка
        $iWndState =  WinGetState($aList[$i][1]) ; Узнать состояние окна
        ; Если окно не отображается или не доступно
        If Not BitAND($iWndState,2) Or Not BitAND($iWndState,4) Then ContinueLoop
        _ArrayAdd($aWindows, $aList[$i][1]&'~|~'&$aList[$i][0],1,'~|~')
        ConsoleWrite($aList[$i][1]&'   '&$aList[$i][0]&@CRLF) ; Хэндл и Заголовок окна
    Next
    $aWindows[0][0]=UBound($aWindows)-1
    Return $aWindows
EndFunc
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Эти окна запущены от имени пользователя, а не от имени системы, можно исключить их из списка по названию

Код:
#include <Array.au3>

$WinList = WinList()
For $Num = 1 To $WinList[0][0]
    If $Num > UBound($WinList)-1 Then ExitLoop

    If Not BitAND(WinGetState($WinList[$Num][1]), 2) Or WinGetTitle($WinList[$Num][1]) = '' Then
        _ArrayDelete($WinList, $Num)
        $Num -= 1
        ContinueLoop
    EndIf
    ConsoleWrite(_ProcessGetOwner(WinGetProcess($WinList[$Num][1]))&@CRLF)
Next

_ArrayDelete($WinList, 0)
_ArrayDisplay($WinList)


Func _ProcessGetOwner($PID, $sComputer = ".")
    Local $objWMI, $colProcs, $sUserName, $sUserDomain
    $objWMI = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
    If IsObj($objWMI) Then
        $colProcs = $objWMI.ExecQuery("Select ProcessId From Win32_Process Where ProcessId=" & $PID)
        If IsObj($colProcs) Then
            For $Proc In $colProcs
                If $Proc.GetOwner($sUserName, $sUserDomain) = 0 Then Return $sUserName
            Next
        EndIf
    EndIf
EndFunc
 
Верх