1 (изменено: ChaoLi, 2013-01-16 13:07:07)

Тема: AHK: Как определить открыты ли в приложении модальные окна?

Возможно ли определить открыты ли в приложении(главном окне) подчинённые модальные окна? Есть ли такое свойство? Или можно ли искать окна по текстовому содержимому? И можно ли определить родительское окно?

При запуске приложения в нём открываются несколько окон сразу или по очереди, некоторые из них неинтересные, другие модальные. Цель моя в закрытии приложения путём посылки в цикле нажатия мыши в окне на "крестик" по координатам. Но никак не получается обработать модальные окна.


WinWait, Проверка легальности получения
if not ErrorLevel
{
; На тот случай, если выскочат ошибки о невозможности открыть интернет эксплорер (2 раза)

    Sleep, 500
    Send {Enter}
    Sleep, 500
    Send {Enter}
    Sleep, 500

; принимаем обновления - здесь всё замечательно
    WinActivate Проверка легальности получения
    Sleep, 200
    Control, Check,, V8FormElement3
    Sleep, 200
    Send ^{Enter}

; На тот случай если появится окно "Изменение версии", в Зарплате
    Sleep, 1000
    Send {Enter}
    Sleep, 1000

; Здесь проходит какое-то время(от 10с до пары минут), программа неактивна, выполняет какие-то действия внутренние

    WinActivate
    ID := WinActive("A")  - получаем ID активного окна, предположительно главного

Loop
{
    WinActivate, ahk_id%ID%

; попытка закрыть приложение через крестик   - через WinClose нельзя, потому что нужно пройти через все модальные окна

    Sleep, 1000
    Click 920, 10
    Send {Enter}
    Sleep, 1000

; !!! Вот здесь проблема.. работает нестабильно

; V8NewLocalFrameBaseWnd - определил с помощью AutoIt3 Window Spy, но и некоторые другие окна имеют подобный класс, что и приводит часто к зацикливанию

; Если существует окно "Установить границу итогов" в Бухне
    IfWinExist, ahk_class V8NewLocalFrameBaseWnd
    {
     WinActivate, ahk_class V8NewLocalFrameBaseWnd
     Send {Enter}
    }

; Если не существует главного окна запущенной ранее 1С - выйти
    IfWinNotExist, ahk_id%ID%
    {
     ExitApp
    }
}
}

PunBB bbcode test

2

Re: AHK: Как определить открыты ли в приложении модальные окна?

Закрыть любое окно с помощью нажатия на крестик можно, отправив ему сообщение WM_SYSCOMMAND:

WinName := "Безымянный — Блокнот ahk_class Notepad"   ; указать заголовок и класс окна (класс можно определить с помощью AU3_Spy.exe)

WM_SYSCOMMAND := 0x112, SC_CLOSE := 0xF060
PostMessage, WM_SYSCOMMAND, SC_CLOSE,,, % WinName
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Как определить открыты ли в приложении модальные окна?

teadrinker пишет:

Закрыть любое окно с помощью нажатия на крестик можно, отправив ему сообщение WM_SYSCOMMAND:

WinName := "Безымянный — Блокнот ahk_class Notepad"   ; указать заголовок и класс окна (класс можно определить с помощью AU3_Spy.exe)

WM_SYSCOMMAND := 0x112, SC_CLOSE := 0xF060
PostMessage, WM_SYSCOMMAND, SC_CLOSE,,, % WinName

Возьму эту функцию на вооружение. Но мне нужно пройти по всем модальным окнам и дождаться их выполнения. Поэтому только один вариант пока нашёл: кликать на крестик пока не закроется. А кликнется он тогда, когда станет активным, а активным он станет как раз когда все модальные окна выполнятся. Но, получается, нужно заранее знать какие окна откроются.

4

Re: AHK: Как определить открыты ли в приложении модальные окна?

ChaoLi пишет:

Возможно ли определить открыты ли в приложении(главном окне) подчинённые модальные окна?

Если в приложении открыты модальные окна, значит главное окно заблокировано. Обычно этого добиваются, применив к нему стиль WS_DISABLED. Соответственно, узнать, открыты ли модальные окна, можно, проверив, есть ли у главного окна этот стиль:

WinName := "...."   ; указать имя и класс окна
WS_DISABLED := 0x8000000

WinGet, Style, Style, % WinName
if (Style & WS_DISABLED)
   MsgBox, Disabled   ; здесь вместо MsgBox необходимые действия
ChaoLi пишет:

И можно ли определить родительское окно?

Можно:

WinName := "....."   ; указать название и класс окна
hParent := DllCall("GetParent", Ptr, WinExist(WinName), Ptr)
WinGetTitle, Title, ahk_id %hParent%
WinGetClass, Class, ahk_id %hParent%
FullTitle := Title . " ahk_class " . Class
MsgBox, % FullTitle

Можно ещё вместо этого отыскать все видимые окна, принадлежащие данному процессу, определить их название, и в зависимости от названия совершать какие-либо действия.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: ChaoLi, 2013-02-05 22:46:58)

Re: AHK: Как определить открыты ли в приложении модальные окна?

Спасибо, teadrinker, всё получилось