Что нового

Может ли AutoIt скрывать окна программы?

GuitarFan

Новичок
Сообщения
5
Репутация
0
Есть определенная программа, которая изобилует разного рода окнами, которые не хотелось бы видеть совсем. Можно ли их скрыть с помощью AutoIt? Или даже вообще скрыть программу полностью, чтобы та работала, но не была видна?
 
Автор
G

GuitarFan

Новичок
Сообщения
5
Репутация
0
DarWiM сказал(а):
GuitarFan [?]
Можно ли их скрыть с помощью AutoIt?
Можно.

Код:
WinSetState()

Как убрать мелькающее окошко?
Код:
; Запуск блокнота
Run('notepad.exe')

; Ожидание 5 секунд до появление окна блокнота
$hWnd = WinWait("[CLASS:Notepad]", "", 5)
If Not $hWnd Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
EndIf

; Поверх всех окон, только для удобства просмотра эффектов
WinSetOnTop($hWnd, "", 1)

; Устанавливает состояния окна
WinSetState($hWnd, "", @SW_HIDE)
If IsHWnd($hWnd) Then MsgBox(4096, 'Сообщение', 'Окно скрыто', 5)

; Закрывает блокнот.
WinClose($hWnd)


Вот это прекрасно работает, но окно все равно сразу появляется и сразу пропадает. Можно как-то сделать, чтобы окно вообще не появлялось?
 
Автор
G

GuitarFan

Новичок
Сообщения
5
Репутация
0
Zaramot сказал(а):
Можно как-то сделать, чтобы окно вообще не появлялось?
Да:
Код:
Run('notepad.exe', '', @SW_HIDE)

Это все хорошо, но у меня определенная программа выбрасывает лишние окна периодически. Я могу как-то прятать окна по имени окна? А еще лучше, как-то прятать все дочерние окна какой-то программы? Вот было бы прекрасно...
 

sims

Осваивающий
Сообщения
184
Репутация
24
GuitarFan [?]
Можно как-то сделать, чтобы окно вообще не появлялось?
Чтобы окно вообще не появлялось (и даже не мелькало), нужно поставить хук на функции CreateWindow и CreateWindowEx в требуемой программе. Но это можно сделать с помощью DLL. Если возникнут сложности с этим, пишите в личку. Возможно смогу помочь.
 
A

at

Гость
Как вариант:
Код:
While 1
	Sleep(100)
    Run('notepad.exe')
    If ProcessExists ('notepad.exe') Then 
	ProcessClose('notepad.exe') 
	EndIf
WEnd
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
at
OffTopic:
Это великолепно! :evil:
 
Автор
G

GuitarFan

Новичок
Сообщения
5
Репутация
0
at сказал(а):
Как вариант:
Код:
While 1
	Sleep(100)
    Run('notepad.exe')
    If ProcessExists ('notepad.exe') Then 
	ProcessClose('notepad.exe') 
	EndIf
WEnd

Это закроет процесс, мне же нужно скрыть окно. То есть вместо ProcessClose('notepad.exe') , нужно что-то вроде WinSetState('notepad.exe', "", @SW_HIDE), что конечно же не работает.
 
Автор
G

GuitarFan

Новичок
Сообщения
5
Репутация
0
Так что, получается дочерние окна закрыть никак нельзя?
 

Skif_off

Знающий
Сообщения
173
Репутация
13
GuitarFan
Вы пробовали определить заголовок/дескриптор/класс дочернего окна и далее использовать WinSetState()?
Можно добавить в начало скрипта Opt("WinWaitDelay", 50), чтобы сократить время. И есть ещё _WinAPI_GetParent()
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
GuitarFan [?]
как-то прятать все дочерние окна какой-то программы
Код:
#Include <WinAPIEx.au3>

Local $iPid = ProcessExists( "explorer.exe" ), _
	$aWnd

;While Sleep( 100 ) And ProcessExists( $iPid ) ;Если процесс создает окна в ходе работы - прячем все окна постоянно пока он существует
	$aWnd = _WinAPI_EnumProcessWindows( $iPid )
	If Not @Error Then
		For $Wnd = 1 To $aWnd[0][0] Step 1
			;_WinAPI_CloseWindow( $aWnd[$Wnd][0] ) ;Закрыть
			;_WinAPI_ShowWindow ( $aWnd[$Wnd][0], @SW_HIDE ) ;Скрыть
		Next
	EndIf
;WEnd
 

art22

Новичок
Сообщения
26
Репутация
1

firex, А есть еще какой то способ? не со всеми программами работает

 
Верх