Что нового

Скрипт не реагирует на определенное открытое окно

cerber412

Новичок
Сообщения
42
Репутация
0
Здравствуйте, форумчане.

Есть скрипт который запускает файл другого скрипт - при условии наличия в файле txt - единицы и наличия в ОС Windows открытого окна с определенными словами в названии.
Но этот скрипт не срабатывает - при наличии 1 в txt и открытом окне с определенным названием.


Код:
#include <MsgBoxConstants.au3>

Local $sFile = ("C:\список файлов\Пуск.au3")

While 1
    If WinExists("Книга Вторая", "")=1 Then
        If WinExists("[CLASS:AutoIt v3 GUI]")=0 Then
             If FileRead("C:\переключатель\триггер.txt") = 1 Then
                    ShellExecute($sFile)
             EndIf
            WinWait("[CLASS:AutoIt v3 GUI]")
        EndIf
    Else
        If WinExists("[CLASS:AutoIt v3 GUI]")=1 Then
            WinClose("[CLASS:AutoIt v3 GUI]")
            WinWaitClose("[CLASS:AutoIt v3 GUI]")
            Exit
        EndIf
    EndIf
    Sleep(100)
WEnd

Не работает вот этот кусок:
If WinExists("Книга Вторая", "")=1 Then
Сама книга эксель с таким названием открыта. То есть вроде как окно существует, но автоит почему-то это окно не воспринимает.

Как поправить этот код, чтобы он реагировал на открытое окно с со словами "Книга Вторая" в названии title ?
 
Последнее редактирование:
Автор
C

cerber412

Новичок
Сообщения
42
Репутация
0
Запустил указанный код.
Результат тот же - скрипт не реагирует на окно.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Что за окна с классом Autoit? разные или одно и то же?
зачем запускать файл au3? он откроется в редакторе и его код работать не будет
Автор, чего точно вы хотите добиться?
 
Автор
C

cerber412

Новичок
Сообщения
42
Репутация
0
joiner
окна с классом AutoIt - это одно и то же окно.
Если файл au3 откроется в редакторе - я его потом скомпилирую в экзешник, чтобы он как надо открывался.

Сейчас вопрос - почему скрипт не реагирует на окно, в названии которого есть слова "Книга Вторая".
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ну как же не реагирует, если WinExists возвращает единицу, то есть, окно найдено
 
Автор
C

cerber412

Новичок
Сообщения
42
Репутация
0
joiner

Ясно.
Так вот этот скрипт - уж не знаю по какой причине - не запускает указанный файл, не реагирует на окно.
Код:
#include <MsgBoxConstants.au3>
Local $sFile = ("C:\список файлов\Пуск.au3")
While 1
If WinExists("Книга Вторая")=1 Then
If WinExists("[CLASS:AutoIt v3 GUI]")=0 Then
If FileRead("C:\переключатель\триггер.txt") = 1 Then
ShellExecute($sFile)
EndIf
WinWait("[CLASS:AutoIt v3 GUI]")
EndIf
Else
If WinExists("[CLASS:AutoIt v3 GUI]")=1 Then
WinClose("[CLASS:AutoIt v3 GUI]")
WinWaitClose("[CLASS:AutoIt v3 GUI]")
Exit
EndIf
EndIf
Sleep(100)
WEnd


Поэтому я и задаю этот вопрос.
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
вот этот скрипт - уж не знаю по какой причине
Ну а что мешает проверить?

Код:
#include <MsgBoxConstants.au3>
Local $sFile = ("C:\список файлов\Пуск.au3")

While 1
    If WinExists("Книга Вторая") = 1 Then
        ConsoleWrite('"Книга Вторая" window exists, checking AutoIt v3 GUI...' & @CRLF)
        
        If WinExists("[CLASS:AutoIt v3 GUI]") = 0 Then
            ConsoleWrite('! AutoIt v3 GUI Not found, checking триггер.txt...' & @CRLF)
            
            If FileRead("C:\переключатель\триггер.txt") = 1 Then
                ConsoleWrite('+ триггер.txt read is 1, executing...' & @CRLF)
                ShellExecute($sFile)
            Else
                ConsoleWrite('! триггер.txt read is NOT 1' & @CRLF)
            EndIf
            
            ConsoleWrite('Waiting for "AutoIt v3 GUI" window...' & @CRLF)
            WinWait("[CLASS:AutoIt v3 GUI]")
            ConsoleWrite('+ Ok, window found' & @CRLF)
        Else
            ConsoleWrite('+ AutoIt v3 GUI found' & @CRLF)
        EndIf
    Else
        If WinExists("[CLASS:AutoIt v3 GUI]") = 1 Then
            ConsoleWrite('"Книга Вторая" window NOT exists, and AutoIt v3 GUI exists, closing...' & @CRLF)
            WinClose("[CLASS:AutoIt v3 GUI]")
            WinWaitClose("[CLASS:AutoIt v3 GUI]")
            Exit
        EndIf
    EndIf
    
    Sleep(100)
WEnd


Что выдаёт консоль?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
думаю, что спотыкается на втором условии
Код:
If WinExists("[CLASS:AutoIt v3 GUI]") = 0 Then

ибо, как мы знаем, даже если нет Gui в коде, то окно все равно есть
а значит, код висит на этом условии. Ведь окно то есть, и оно принадлежит этому же скрипту.
из этого следует, лучше создать невидимое окно с заголовком и у запускаемого кода тоже окно с заголовком
то есть, просто добавить в начало этого кода
Код:
GUICreate('script_1')

а в том коде, который нужно запустить(пуск.au3) другую запись
Код:
GUICreate('script_2')

названия окон для примера
тогда в WinExists, где идет проверка наличия окна Autoit, писать не класс, а заголовок
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
как мы знаем, даже если нет Gui в коде, то окно все равно есть
У него там другой класс: AutoIt v3 (без GUI).
Я бы посоветовал автору озвучить полностью задачу, возможно не нужен этот весь огород.
 
Автор
C

cerber412

Новичок
Сообщения
42
Репутация
0
CreatoR
Я запустил скрипт, и вот что выдает консоль.
В случае если окна "Книга Вторая" - нет, то в консоли пишет одну строчку - типа - "окно не существует"

Но вот если окно "Книга Вторая" открыто - то консоль начинает выдавать бесконечные сообщения, каждую долю секунды:
"Книга Вторая" window exists, checking AutoIt v3 GUI...
+ AutoIt v3 GUI found
"Книга Вторая" window exists, checking AutoIt v3 GUI...
+ AutoIt v3 GUI found
"Книга Вторая" window exists, checking AutoIt v3 GUI...
+ AutoIt v3 GUI found
"Книга Вторая" window exists, checking AutoIt v3 GUI...
+ AutoIt v3 GUI found
"Книга Вторая" window exists, checking AutoIt v3 GUI...
+ AutoIt v3 GUI found
"Книга Вторая" window exists, checking AutoIt v3 GUI...
+ AutoIt v3 GUI found
"Книга Вторая" window exists, checking AutoIt v3 GUI...

И так до бесконечности
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
У него там другой класс
разве. везде написано с Gui

короче, смысл запускать еще один скрипт, если все можно сделать в одном коде?
проверяем наличие окна в заголовком, выполняем функцию. Триггер, как я понял, это для обмена данными, типа флага.

автор, правильно пишет в консоли. Заголовок скрипт видит, и видит свое окно.
Может напишите точно что нужно? Саму задачу опишете?
 
Автор
C

cerber412

Новичок
Сообщения
42
Репутация
0
joiner
Скажите - при команде
Код:
GUICreate('script_1')

создастся окно с title: "script_1" ?
А проверка тогда будет:
Код:
If WinExists("[Title:script_1]") = 0 Then

Все правильно ?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
Opt("WinTitleMatchMode", 3)
GUICreate('script_1')
While Sleep(100)
    If WinExists("script_1") Then ExitLoop
WEnd

и конечно же...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
MsgBox(64, @ScriptName, WinExists("[CLASS:AutoIt v3 GUI]"))
Если у тебя это 1, то видимо где то в фоне запущен ещё скрипт AutoIt который создаёт GUI.
Попробуй так:

Код:
;Раскомментируй чтобы увидеть разницу
;GUICreate('Test')

$aList = WinList("[CLASS:AutoIt v3 GUI]")

For $i = 1 To $aList[0][0]
    If WinGetProcess($aList[$i][1]) = @AutoItPID Then
        MsgBox(64, @ScriptName, $aList[$i][0])
    EndIf
Next


Для сравнения:
Код:
$aList = WinList("[CLASS:AutoIt v3]")

For $i = 1 To $aList[0][0]
    If WinGetProcess($aList[$i][1]) = @AutoItPID Then
        MsgBox(64, @ScriptName, $aList[$i][0])
    EndIf
Next
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
MsgBox(64, @ScriptName, WinExists("[CLASS:AutoIt v3 GUI]"))
Возможно это из-за SciTE
Код:
#include <WinAPIProc.au3>
#include <Array.au3>

_ArrayDisplay(_WinAPI_EnumProcessWindows(0, False), "_WinAPI_EnumProcessWindows")

Global $aWinList = WinList("[CLASS:AutoIt v3 GUI]")
For $i = 1 To $aWinList[0][0]
    $aWinList[$i][1] = "PID: " & WinGetProcess($aWinList[$i][0])
Next
_ArrayDisplay($aWinList, "@AutoItPID: " & @AutoItPID)

1591818339991.png
 
Верх