Что нового

[Окна, Диалоги] Неправильная работа WinExists

veselroger

Новичок
Сообщения
16
Репутация
3
Здравствуйте.
Столкнулся с проблемой, которую понять не могу, а вроде бы она элементарная.
Функция WinExists и WinWaitActive видят не только существующие, но и несуществующие окна(с title набранным наугад вроде "dfsfdsfsdfs" и произвольными ID).
Смысл кода - в поля Input вводятся данные(Title,Class,Handle и PID). Далее составляется строка с непустыми значениями и ищется по этой строке окно. Далее оно становится активным. Ниже часть кода, который является OnEvent'ом. В остальном коде лишь создаётся Tab для отображение полей и лэйблов.
Код:
Func FindWindow()
   $stroka="["
   If GUICtrlRead ($InputTitle)<>"" then $stroka=$stroka&"TITLE:"&GUICtrlRead ($InputTitle)&";"
   If GUICtrlRead ($InputClass)<>"" then $stroka=$stroka& " CLASS:"&GUICtrlRead ($InputClass)&";"
   If GUICtrlRead ($InputHandle)<>"" then $stroka=$stroka& " HANDLE:"&GUICtrlRead ($InputHandle)&";"
   IF GUICtrlRead ($InputPID)<>"" then $stroka=$stroka& " PID:"&GUICtrlRead ($InputPID)
   $znak=StringMid($stroka, StringLen($stroka), 1)
   if $znak=";" then $stroka=StringMid($stroka,1,StringLen($stroka)-1)
   $stroka=$stroka&"]"
   msgbox (1,"stroka",$stroka)
   $hwnd=WinGetHandle($stroka)
   If WinExists($hwnd) then 
	  msgbox (1,"Окно найдено","Окно найдено")
	  WinActivate($hwnd)
   Else
	  msgbox (1,"Ошибка","Окно обнаружить не удалось!")
   Endif
EndFunc ;<--FindWindow - Найти окно по параметрам

Пробовал как только мог, всё равно видятся окна, которых не существует в природе. В чём у меня может быть ошибка? Заранее благодарен.
Плюс, почему-то не ищется окно ни по чему, кроме заголовка. Тестирую на обычном блокноте и калькуляторе. Да, если такую-же проверку выполнить тем же текстом, но вбив его в коде - всё работает.
Это особенность AutoIT или можно как-нибудь обойти это?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
veselroger,
Код:
$hWin = WinGetHandle('[TITLE:12345; CLASS:12345]')
If $hWin Then
	ConsoleWrite('Exist this window' & @LF)
Else
	ConsoleWrite('Not exist this window' & @LF)
EndIf
А разве используется HANDLE: и PID: ? Что в справке сказано по этому поводу?


Добавлено:
Сообщение автоматически объединено:

veselroger [?]
Функция WinExists и WinWaitActive видят не только существующие, но и несуществующие окна
У Вас в коде, при несуществующем окне, $hwnd равен '' (пусто). Результат:
Код:
ConsoleWrite(WinExists('') & @LF)
 
Автор
veselroger

veselroger

Новичок
Сообщения
16
Репутация
3
Спасибо, я почему-то думал, что доступно любое из предложенных свойств для идентификации. Буду теперь знать.

Но вопрос про видимость несуществующих окон пока непонятен. WinExists строчки у меня равен при правильном определении окна(окно блокнота становится активным) 1 и при неправильном определении(окна нету, становиться активным нечему) всё равно 1.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
veselroger [?]
Но вопрос про видимость несуществующих окон пока непонятен
Вам же madmasles объяснил: если окна нет, то функция
Код:
WinGetHandle()
возвращает пустую строку. А вызов функции
Код:
WinExists()
с пустой строкой в качестве параметра вернёт единицу, т.к. пустая строка - это текущее активное окно.

Замените в скрипте
Код:
If WinExists($hwnd) then
на
Код:
If $hwnd then
 
Верх