Autoit как найти окно

Заголовки и текст окон (расширенные)

AutoIt может искать окна в одном из трёх режимов сравнения заголовков. Режим сравнения устанавливается функцией AutoItSetOption с помощью опции WinTitleMatchMode

Режим 1 (по умолчанию)

Сравнивает часть заголовка с его началом.

В этом режиме окно с заголовком Безымянный – Блокнот может быть найдено как
“Безымянный – Блокнот”, “Безымянный”, “Бе” и т.п.

Пример:

WinWait(“Безымянный”)

Режим 2

Сравнивает любую подстроку заголовка.

В этом режиме окно с заголовком Безымянный – Блокнот может быть найдено как
“Безымянный – Блокнот”, “Безымянный”, “Блокнот”,
“нот” и т.п.

Пример:

WinWait(“Блокнот”)

Режим 3

Полное совпадение заголовка.

В этом режиме окно с заголовком Безымянный – Блокнот может быть найдено только
при использовании “Безымянный – Блокнот”

Режим 4 (Оставлено для обратной совместимости)

Расширенный режим

Текст заголовка должен быть заменён расширенными параметрами, и это не нуждаются в установке какого либо режима сравнения заголовков.

Режимы от -1 до -3

Принудительное сравнение заголовка в нижнем регистре (по соответствующим режиму правилам).

Расширенные установки поиска окна

Специальное установки могут быть использованы в качестве параметра title в функциях работы с окнами. Эти установки могут быть использованы, чтобы отличить окна по следующим свойствам:

  • TITLE – Заголовок окна
  • CLASS – Внутреннее название класса окна
  • REGEXPTITLE –Заголовок окна (с использованием регулярных выражений, если регулярное выражение составлено неверно, значение @error будет установлено равным 2)
  • REGEXPCLASS – Название класса окна (с использованием регулярных выражений, если регулярное выражение составлено неверно, значение @error будет установлено равным 2)
  • LAST – Последнее окно, использованное в предыдущей команде AutoIt
  • ACTIVE – Текущее активное окно
  • X Y W H
    – Координаты и размер окна
  • INSTANCE – Номер экземпляра окна, если несколько окон соответствуют критерию поиска (отсчёт начинается с 1).

В функциях по работе с окнами в качестве параметра title могут использоваться одно или несколько свойств в следующем формате:

[СВОЙСТВО1:Значение1; СВОЙСТВО2:Значение2]

Пары “Свойство” и “Значение” перечисляются через “;”, а между собой “Свойство” и “Значение” разделяются с помощью “:”.

Примечание: если “Значение” должно содержать символ “;”, он должен быть продублирован.

Пример: ожидать активацию окна с названием класса “Notepad”

WinWaitActive(“[CLASS:Notepad]”, “”)

Пример: закрыть текущее активное окно

WinClose(“[ACTIVE]”, “”)

Пример: ожидать активацию второго окна с заголовком “My Window” и именем класса “My Class”. Используются 3 свойства

WinWaitActive(“[TITLE:My Window; CLASS:My Class; INSTANCE:2]”, “”)

Пример: получить список с именем класса, удовлетворяющем указанному шаблону регулярного выражения

WinList(“[REGEXPCLASS:#d+]”)

Пример: получить текст заголовка окна, с координатами X=50; Y=40, шириной равной 300, высотой равной 250. Всю метрику окна указывать не обязательно. Используются 5 свойств.

WinGetTitle(“[CLASS:My Class; X:50; Y:40; W:300; H:250]”)

Дескрипторы окон (HWND)

Различные тип данных в AutoIt имеет встроенную поддержку дескрипторов окон (HWND). Дескриптор окна – специальное значение, которое операционная система присваивает каждому создаваемому окну. Если имеется дескриптор, то его можно использовать вместо параметра title в любых функциях, работающих с окнами, имеющие параметры title/text. Преимущество использования дескриптора окна наблюдается в случаях, когда открыто несколько приложений, имеющих такие же заголовки и текст, при этом вы можете однозначно идентифицировать окно по его дескриптору.
При использовании дескриптора окна в качестве параметра title, параметр text полностью игнорируется.

Многие функции, например WinGetHandle, WinList и GUICreate возвращают именно дескриптор окна. Важно заметить, дескриптор окна не рассматривается, как число или строка – это уникальный тип данных.

Примечание: при использовании дескриптора окно однозначно определяется, не принимая во внимание установленный режим WinTitleMatchMode.

Пример

$handle = WinGetHandle(“Безымянный – Блокнот”, “”)

WinClose($handle)

Here’s a complete example of a full screen GUI, displaying the actual screen and a border around the window that’s topmost under the mouse pointer. This function is used to write the Title of the window to console.

#include <Misc.au3>
#include <Array.au3>
#include <GDIPlus.au3>
#include <ScreenCapture.au3>
#include <WindowsConstants.au3>

HotKeySet("{Esc}", "_Exit")
Func _Exit()
    Exit 0
EndFunc

Global $xPosReminder, $yPosReminder
$dll = DllOpen("user32.dll")

$allWindows = WinList()
; exclude invisible windows from winlist
Dim $windows[1]
$windows[0] = 0
For $i = 1 to $allWindows[0][0]
    ; only fetches visible windows
    If BitAnd(WinGetState($allWindows[$i][1]), 2) Then;AND $allWindows[$i][0] <> "" Then
        ReDim $windows[$windows[UBound($windows) - 1] + 2]
        $windows[UBound($windows) - 1] = $windows[UBound($windows) - 2] + 1
        $windows[UBound($windows) - 2] = $allWindows[$i][1]
    EndIf
Next
ReDim $windows[$windows[UBound($windows) - 1]]
_ArrayReverse($windows)

; capture screen without cursor
$pos = MouseGetPos()
MouseMove(@DesktopWidth, @DesktopHeight, 0)
$hBitmap = _ScreenCapture_Capture ("")
MouseMove($pos[0], $pos[1], 0)

; create and show new fullscreen gui
$hGUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
GUISetState(@SW_SHOW)

; Initialize GDI+ library
_GDIPlus_StartUp()
$hImage = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap)
$hGraphics = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
$hPen = _GDIPlus_PenCreate(0xFFFF0000, 3, 2)
$iX = _GDIPlus_ImageGetWidth($hImage)
$iY = _GDIPlus_ImageGetHeight($hImage)

_GDIPlus_GraphicsDrawImage($hGraphics, $hImage, 0, 0)

Global $oldWindow = 0
; Wait for Click
While True
    If _IsPressed("01", $dll) Then ; left mouse button
        $xPos = MouseGetPos(0)
        $yPos = MouseGetPos(1)
        ExitLoop
    EndIf
    If __MouseMoved() Then
        ; Erzeugt eine Kopie einer 24 bit Bitmap
        $hClone = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iX, $iY, $GDIP_PXF24RGB)

        $currentWindow = __GetWindowByMousePosition($windows, MouseGetPos(0), MouseGetPos(1))
        If $currentWindow <> $oldWindow Then
            $windowPosition = WinGetPos($currentWindow)

            ; reduce position and size to desktop space
            $windowPosition[0] = _Iif($windowPosition[0] < 0, 0, $windowPosition[0])
            $windowPosition[1] = _Iif($windowPosition[1] < 0, 0, $windowPosition[1])
            $windowPosition[2] = _Iif($windowPosition[2]  > @DesktopWidth, @DesktopWidth, $windowPosition[2])
            $windowPosition[3] = _Iif($windowPosition[3] > @DesktopHeight, @DesktopHeight, $windowPosition[3])

            _GDIPlus_GraphicsDrawImage($hGraphics, $hClone, 0, 0)
            _GDIPlus_GraphicsDrawRect($hGraphics, $windowPosition[0], $windowPosition[1], $windowPosition[2], $windowPosition[3], $hPen)
            $oldWindow = $currentWindow
        EndIf
    EndIf
    Sleep(1)
WEnd

; Free Ressources
_GDIPlus_PenDispose($hPen)
_GDIPlus_BitmapDispose($hImage)
_GDIPlus_GraphicsDispose($hGraphics)
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_ShutDown()
DllClose($dll)

GUISetState(@SW_HIDE)

Func __GetWindowByMousePosition($windows, $xPos, $yPos)
    Local $currentWindow = 0
    For $i = 0 to UBound($windows) - 1
        $pos = WinGetPos($windows[$i])
        If $xPos >= $pos[0] AND $xPos <= $pos[0] + $pos[2] AND $yPos >= $pos[1] AND $yPos <= $pos[1] + $pos[3] Then
            $currentWindow = $windows[$i]
        EndIf
    Next
    Return $currentWindow
EndFunc

Func __MouseMoved()
    Local $actualPos = MouseGetPos()
    If $xPosReminder <> $actualPos[0] OR $yPosReminder <> $actualPos[1] Then
        $xPosReminder = $actualPos[0]
        $yPosReminder = $actualPos[1]
        Return True
    Else
        Return False
    EndIf
EndFunc

ConsoleWrite(WinGetTitle(__GetWindowByMousePosition($windows, $xPos, $yPos)) & @CR)

Заголовки и текст окон (расширенные)

AutoIt может искать окна в одном из трёх режимов сравнения заголовков. Режим сравнения устанавливается функцией AutoItSetOption с помощью опции WinTitleMatchMode

Режим 1 (по умолчанию)

Сравнивает часть заголовка с его началом.

В этом режиме окно с заголовком Безымянный – Блокнот может быть найдено как “Безымянный – Блокнот”, “Безымянный”, “Бе” и т.п.

Пример:

WinWait(“Безымянный”)

Режим 2

Сравнивает любую подстроку заголовка.

В этом режиме окно с заголовком Безымянный – Блокнот может быть найдено как “Безымянный – Блокнот”, “Безымянный”, “Блокнот”, “нот” и т.п.

Пример:

WinWait(“Блокнот”)

Режим 3

Полное совпадение заголовка.

В этом режиме окно с заголовком Безымянный – Блокнот может быть найдено только при использовании “Безымянный – Блокнот”

Режим 4 (Оставлено для обратной совместимости)

Расширенный режим

Текст заголовка должен быть заменён расширенными параметрами, и это не нуждаются в установке какого либо режима сравнения заголовков.

Режимы от -1 до -3

Принудительное сравнение заголовка в нижнем регистре (по соответствующим режиму правилам).

Расширенные установки поиска окна

Специальное установки могут быть использованы в качестве параметра title в функциях работы с окнами. Эти установки могут быть использованы, чтобы отличить окна по следующим свойствам:

  • TITLE – Заголовок окна
  • CLASS – Внутреннее название класса окна
  • REGEXPTITLE –Заголовок окна (с использованием регулярных выражений, если регулярное выражение составлено неверно, значение@error будет установлено равным 2)
  • REGEXPCLASS – Название класса окна (с использованием регулярных выражений, если регулярное выражение составлено неверно, значение @error будет установлено равным 2)
  • LAST – Последнее окно, использованное в предыдущей команде AutoIt
  • ACTIVE – Текущее активное окно
  • X  Y  W  H – Координаты и размер окна
  • INSTANCE – Номер экземпляра окна, если несколько окон соответствуют критерию поиска (отсчёт начинается с 1).

В функциях по работе с окнами в качестве параметра title могут использоваться одно или несколько свойств в следующем формате:

[СВОЙСТВО1:Значение1; СВОЙСТВО2:Значение2]

Пары “Свойство” и “Значение” перечисляются через “;”, а между собой “Свойство” и “Значение” разделяются с помощью “:”.

Примечание: если “Значение” должно содержать символ “;”, он должен быть продублирован.

Пример: ожидать активацию окна с названием класса “Notepad”

WinWaitActive(“[CLASS:Notepad]”, “”)

Пример: закрыть текущее активное окно

WinClose(“[ACTIVE]”, “”)

Пример: ожидать активацию второго окна с заголовком “My Window” и именем класса “My Class”. Используются 3 свойства

WinWaitActive(“[TITLE:My Window; CLASS:My Class; INSTANCE:2]”, “”)

Пример: получить список с именем класса, удовлетворяющем указанному шаблону регулярного выражения

WinList(“[REGEXPCLASS:#d+]”)

Пример: получить текст заголовка окна, с координатами X=50; Y=40, шириной равной 300, высотой равной 250. Всю метрику окна указывать не обязательно. Используются 5 свойств.

WinGetTitle(“[CLASS:My Class; X:50; Y:40; W:300; H:250]”)

Дескрипторы окон (HWND)

Различные тип данных в AutoIt имеет встроенную поддержку дескрипторов окон (HWND). Дескриптор окна – специальное значение, которое операционная система присваивает каждому создаваемому окну. Если имеется дескриптор, то его можно использовать вместо параметра title в любых функциях, работающих с окнами, имеющие параметры title/text. Преимущество использования дескриптора окна наблюдается в случаях, когда открыто несколько приложений, имеющих такие же заголовки и текст, при этом вы можете однозначно идентифицировать окно по его дескриптору. При использовании дескриптора окна в качестве параметра title, параметр text полностью игнорируется.

Многие функции, например WinGetHandleWinList и GUICreate возвращают именно дескриптор окна. Важно заметить, дескриптор окна не рассматривается, как число или строка – это уникальный тип данных.

Примечание: при использовании дескриптора окно однозначно определяется, не принимая во внимание установленный режим WinTitleMatchMode.

Пример:

$handle = WinGetHandle(“Безымянный – Блокнот”, “”) 
WinClose($handle)

Последнее время пришлось по работе заниматься написанием небольшого приложения на AutoIt-те и в ходе работы выяснилось, что утилита Autoit Window Info Tool не всегда может извлечь информацию о том или ином элементе управления исследуемого приложения. Тут меня и разобрал интерес, а как эта утилита работает и что в действительности значит получаемая ею информация.

Title для главного окна и Text для элемента управления не требуют особого пояснения.

Class – это название так называемого оконного класса (window class ).

Оконный класс – это структура (WNDCLASSEX), определяющая основные характеристики окна. К ним относятся стиль окна и связанные с окном ресурсы, такие как пиктограмма, курсор, меню и кисть для закрашивания фона. Кроме того, одно из полей структуры содержит адрес оконной процедуры, предназначенной для обработки сообщений, получаемых любым окном данного класса.

Ссылка на оконный класс передается функции CreateWindow (или CreateWindowEx), вызываемой для создания окна.

Использование класса окна позволяет создавать множество окон на основе одного и того же оконного класса и, следовательно, использовать одну и ту же оконную процедуру. Например, все кнопки в программах Windows созданы на основе оконного класса BUTTON. Оконная процедура этого класса, расположенная в системной dll, управляет обработкой сообщений для всех кнопок всех окон. Аналогичные системные классы имеются и для других элементов управления, таких как, например, списки и поля редактирования. В совокупности эти классы называются предопределенными или стандартными оконными классами.

Для главного окна приложение обычно создает собственный оконный класс, инициализируя структуру WNDCLASS (или WNDCLASSEX) и регистрируя этот класс вызовом функции RegisterClass (или RegisterClassEx).

Position – для диалогового окна это (x, y) – координаты относительно левого верхнего угла экрана (можно получить например функцией GetWindowRect), для дочерних окон элементов управления это (x, y) – координаты относительно левого верхнего угла клиентской области содержащего их окна.

Вот фрагмент кода, получающий этот параметр:

    HWND hWnd; // дескриптор исследуемого окна
    HWND hWndRoot = GetAncestor(hWnd, GA_ROOT);
    POINT wndPos; // position окна
    RECT  wndRect;
    GetWindowRect(hWnd, &wndRect);
    int wndWidth  = wndRect.right - wndRect.left;
    int wndHeight = wndRect.bottom - wndRect.top;

    if(hWndRoot == hWnd)
    {
        wndPos.x  = wndRect.left;
        wndPos.y  = wndRect.top;
    }
    else
    {
        WINDOWINFO rootWndInfo = {sizeof(WINDOWINFO)};
        GetWindowInfo(hWndRoot, &rootWndInfo);
        wndPos.x  = wndRect.left - rootWndInfo.rcClient.left;
        wndPos.y  = wndRect.top - rootWndInfo.rcClient.top;
    }

Size – ширина и высота окна в пикселях.

Style и ExStyle – стиль и расширенный стиль окна. Они содержаться в структуре WINDOWINFO значение которой для данного окна можно получить, вызывая функцию GetWindowInfo.

ID – идентификатор дочернего окна, который передается в функцию CreateWindow (или CreateWindowEx) при его создании (см. описание параметра hMenu у этих функций). Этот идентификатор передается в оконную функцию при сообщениях WM_COMMAND и WM_NOTIFY и по нему можно определить элемент управления, к которому относится это сообщение.

Handle – дескриптор окна который возвращает функция CreateWindow (или CreateWindowEx) при своем успешном завершении. Он меняет свое значение от запуска к запуску приложения.

Instance. Для выяснения значения этого параметра проведем следующий эксперимент. Рассмотрим следующее диалоговое окно

Вот фрагмент кода файла ресурсов, который отвечает за его создание:

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_MAIN DIALOG 0, 0, 280, 300
STYLE DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_THICKFRAME | WS_SYSMENU
EXSTYLE WS_EX_TOPMOST
CAPTION "WinInfo"
MENU IDR_MENU1
FONT 8, "Ms Shell Dlg"
{
    GROUPBOX        "Basic Window Info", IDC_STATIC1, 5, 5, 270, 43
    LTEXT           "Title:", IDC_STATIC, 14, 17, 16, 8, SS_LEFT
    EDITTEXT      IDC_EDIT1, 57, 14, 212, 12, ES_AUTOHSCROLL | ES_READONLY
    LTEXT           "Class:", IDC_STATIC, 15, 32, 20, 8, SS_LEFT
    EDITTEXT       IDC_EDIT2, 57, 30, 212, 12, ES_AUTOHSCROLL | ES_READONLY
    GROUPBOX      "Finder Tool", IDC_STATIC2, 227, 50, 48, 43, BS_NOTIFY
    GROUPBOX      "Basic Control Info", IDC_STATIC, 5, 50, 215, 43
    LTEXT           "Class:", IDC_STATIC, 16, 60, 20, 8, SS_LEFT
    LTEXT           "Instance:", IDC_STATIC, 15, 74, 30, 8, SS_LEFT
    EDITTEXT     IDC_EDIT3, 57, 59, 158, 12, ES_AUTOHSCROLL | ES_READONLY
    EDITTEXT     IDC_EDIT4, 57, 74, 158, 12, ES_AUTOHSCROLL | ES_READONLY
    CONTROL     "", IDC_STATIC3, WC_STATIC, SS_BITMAP | SS_NOTIFY, 233, 61, 32, 25
    CONTROL     "", IDC_TAB1, WC_TABCONTROL, 0, 5, 100, 270, 195
}

За создание четырех текстовых полей Title, Class (в группе Basic Window Info), Class и ID (в Basic Control Info) отвечают выделенные строки. Autoit Window Info Tool для этих полей вернет соответственно значения Instance равные 1, 2, 3 и 4.

Если теперь взять и отредактировать файл ресурсов, поставив строку создающую, скажем, IDC_EDIT4 перед IDC_EDIT1, перекомпилировать проект и посмотреть какие Autoit Window Info Tool возвращает значения, то мы получим:

для IDC_EDIT1 => Instance = 2 , для IDC_EDIT2 => Instance = 3 , для IDC_EDIT3 => Instance = 4 , для IDC_EDIT4 => Instance = 1. То есть, Instance всего лишь указывает на порядок, в котором создаются элементы управления при инициализации приложения. У меня на практике был случай, когда у элементов управления менялся instance при переключении между вкладками в диалоговом окне.

В заключение хочу немного рассказать об алгоритме поиска дочернего окна по оконным координатам указателя мыши. В WinApi для этого есть следующие функции WindowFromPoint , ChildWindowFromPoint , RealChildWindowFromPoint. Но проблема в том, что если, скажем, несколько элементов управления находятся в группирующей их рамке, то по наведению на них мы не получим их дескриптора, а будем получать дескриптор рамки (даже использую RealChildWindowFromPoint у меня не получилось получить дескриптор элемента на котором находился курсор, хотя в документации по RealChildWindowFromPoint и сказано “… For example, if the point is in a transparent area of a groupbox, RealChildWindowFromPoint returns the child window behind a groupbox, whereas ChildWindowFromPoint returns the groupbox.”)

Я делал так. Вызывая WindowFromPoint, находил дескриптор окна, потом для этого окна получал самого верхнего его родителя GetAncestor(hWnd, GA_ROOT) . Потом для этого родителя находил все его дочерние окна. И из них выбирал наименьшее по размерам видимое окно, которому принадлежит точка с координатами указателя мыши. Вот класс, который это реализует.

/* WindowFinder.h */

#pragma once

#include <windows.h>
#include <stack>


#include "Debug.h"

using namespace std;

class WindowFinder
{
    public:
        static HWND findWindow(HWND hWnd, POINT point);
        
    private:
        static BOOL CALLBACK addChildWnd(HWND hWnd, LPARAM lParam);
        static stack<HWND> childWnd;
};
/* WindowFinder.cpp */

#include "WindowFinder.h"

stack<HWND> WindowFinder::childWnd = stack<HWND>();

HWND WindowFinder::findWindow(HWND hWnd, POINT point)
{
    HWND root = GetAncestor(hWnd, GA_ROOT);

    if(root == NULL){
        return NULL;
    }


    HWND findWnd = NULL;
    int  wndSize = INT_MAX;


    EnumChildWindows(root, addChildWnd, 0);

    while(!childWnd.empty())
    {
        HWND testWnd = childWnd.top();
        childWnd.pop();

        RECT testWndRect;

        if(!GetWindowRect(testWnd, &testWndRect))
        {
            DWORD dwError = GetLastError();
            _tprintf(_T("GetWindowRect: dwError = %in"), dwError);
            Debug::printErrorMessage(dwError);
            continue;
        }

        if(IsWindowVisible(testWnd) && PtInRect(&testWndRect, point))
        {
            int rectSize = abs((testWndRect.right - testWndRect.left) * (testWndRect.bottom - testWndRect.top));

            if(rectSize < wndSize)
            {
                findWnd = testWnd;
                wndSize = rectSize;
            }
        }
    }

    return findWnd;
}


BOOL WindowFinder::addChildWnd(HWND hWnd, LPARAM lParam)
{
    childWnd.push(hWnd); 
    return TRUE;
}

А вот моя реализация утилиты, которая работает, аналогично Autoit Window Info Tool. На вкладке Wnd Info отображается информация об элементе управления, выбранном при помощи Finder Tool, его непосредственном родителе и корневом родителе. На вкладке All Windows строится дерево из всех окон всех приложений, создавших элементы графического интерфейса на текущий момент. По двойному клику на узле дерева появляется окно с подробной информацией об элементе.

Вот и все, спасибо за внимание. :)

403 / 86 / 8

Регистрация: 16.02.2013

Сообщений: 356

1

Как получить дескриптор активного окна?

23.11.2013, 12:33. Показов 8872. Ответов 2


Студворк — интернет-сервис помощи студентам

Перебрать все открытые окна? Какой признак есть у активного окна?



0



Эксперт Java

3638 / 2970 / 918

Регистрация: 05.07.2013

Сообщений: 14,220

14.04.2014, 20:46

2

wingethandle(“[ACTIVE]”)?

пардон, закопайте, обратно.



0



669 / 640 / 335

Регистрация: 26.04.2014

Сообщений: 2,122

29.04.2014, 22:48

3

Лучший ответ Сообщение было отмечено Eva Rosalene как решение

Решение

Код

$hwnd = WinGetHandle("[ACTIVE]")

Перебрать все открытые окна

Код

$aList = WinList(Default)
For $i = 0 To $aList[0][0]
	$hwnd = $aList[$i][1]
	If WinActive($hwnd) Then
		MsgBox(0, 'yes', 'window is active')
	Else
;~ MsgBox(0, 'no', 'window is not active')
	EndIf
Next

И того:

Код

Local $hwnd, $aList

$hwnd = WinGetHandle("[ACTIVE]")
If IsHWnd($hwnd) Then
	MsgBox(0, 'yes', 'window is active')
Else
;~ MsgBox(0, 'no', 'window is not active')
EndIf

$aList = WinList(Default)
For $i = 0 To $aList[0][0]
	$hwnd = $aList[$i][1]
	If WinActive($hwnd) Then
		MsgBox(0, 'yes', 'window is active')
	Else
;~ MsgBox(0, 'no', 'window is not active')
	EndIf
Next



1



Добавить комментарий