Что нового

Реакция на наличие определенного текста в пути процесса

lixar21

Чайник
Сообщения
65
Репутация
0
Версия AutoIt: 3.3.14.2

Описание:
Доброго времени суток.
У меня есть вопрос про реакцию скрипт autoit - на наличие определенного текста ":\Wind" в пути процесса запущенного окна.

Скрипт висит в трее.
Если скрипт замечает, что открыто окно у которого путь процесса, например "C:\Windows\System32\notepad.exe" то скрипт тут же выдает сообщение msgbox и продолжает свою работу.
То есть скрипт реагирует не на title или какой-то другой параметр, и не на название процесса - а на наличия определенного текста - в полному пути этого процесса.

Как это сделать в autoit ?



Примечания:
 

xXx

Меценат
Меценат
Сообщения
85
Репутация
25
lixar21 сказал(а):
... Скрипт висит в трее...
Долго не провисит ;)

Интересно, а что вы будете делать после закрытия вот таких процессов?
"C:\Windows\explorer.exe"
"C:\Windows\System32\WinLogon.exe"
"C:\Windows\System32\svchost.exe"
 
Автор
L

lixar21

Чайник
Сообщения
65
Репутация
0
xXx [url_ex=javascript:qq.OpenLink('http://autoit-script.ru/index.php?topic=26924.msg148362#msg148362')][?][/url_ex]
что вы будете делать после закрытия вот таких процессов?
Я написал - "например".

Тогда, как закрыть окно - у которого в адресе процесса - есть такой текстовый фрагмент "Files (x86)\Adobe\" ?
 

xXx

Меценат
Меценат
Сообщения
85
Репутация
25
Код:
#include <WinAPIProc.au3>

Global $sFindStr = 'Files (x86)\Adobe\'
Global $aList, $iPID, $sProcPath, $sStr

While Sleep(500)
	$aList = WinList()
	For $i = 1 To $aList[0][0]
		$iPID = WinGetProcess($aList[$i][1])
		If $iPID = -1 Then ContinueLoop
		$sProcPath = _WinAPI_GetProcessFileNameEx($iPID)
		If @error Then ContinueLoop
		If StringInStr($sProcPath, $sFindStr) And ProcessClose($iPID) Then $sStr &= @LF & $sProcPath
	Next
	If $sStr Then
		MsgBox(262144, Default, 'Были закрыты следующие программы:' & $sStr)
		$sStr = ''
	EndIf
WEnd

; Извлекает полный путь к исполняемому файлу для указанного процесса
Func _WinAPI_GetProcessFileNameEx($iPID = 0)
	; Не зависит от разрядности указанного процесса и скрипта ( http://autoit-script.ru/index.php?topic=15582.msg97039#msg97039 )
	; Для ОС Выше Win7 используйте _WinAPI_GetProcessFileName()
	Local $hProcess, $Ret, $iError, $iExtended
	If Not $iPID Then $iPID = @AutoItPID

	$hProcess = DllCall('kernel32.dll', 'handle', 'OpenProcess', 'dword', (($__WINVER < 0x0600) ? 0x00000410 : 0x00001010), 'bool', 0, 'dword', $iPID)
	If @error Or Not $hProcess[0] Then Return SetError(@error + 20, @extended, '')

	If $__WINVER < 0x0600 Then
		$aRet = DllCall(@SystemDir & '\psapi.dll', 'dword', 'GetModuleFileNameExW', 'handle', $hProcess[0], 'handle', 0, 'wstr', '', 'int', 4096)
	Else
		$aRet = DllCall('kernel32.dll', 'int', 'QueryFullProcessImageNameW', 'ptr', $hProcess[0], 'dword', 0, 'wstr', '', 'dword*', 4096)
	EndIf
	$iError = @error
	$iExtended = @extended
	DllCall('kernel32.dll', 'bool', 'CloseHandle', 'handle', $hProcess[0])

	If $iError And (Not $aRet[0]) Then Return SetError($iError + 10, $iExtended, '')
	Return $aRet[3]
EndFunc   ;==>_WinAPI_GetProcessFileNameEx
 
Автор
L

lixar21

Чайник
Сообщения
65
Репутация
0
xXx спасибо.
 
Верх