Всем привет. Решил написать сюда, т.к. уже сломал голову, что можно бы сделать...
Есть скрипт "X", который ищет запущенные консольные приложения, работающие в скрытом режиме и завершает их. Есть скрипт "Y", который является консольным приложением, которое скрипт "X" запускает в скрытом режиме, берет его PID для проверки и при сканирование на наличие запущенных консольных скрытых приложений не трогает его, сверяя PID.
Нужно из скрипта "Y" запустить консольное приложение "Z" с параметром @SW_HIDE и чтобы скрипт "X" его не трогал. Скрипт "Х" ищет приложения по классу "CLASS:ConsoleWindowClass", затем найденные приложения проверяет скрытое оно или нет, если скрытое, то сравнивает с PID приложения "Y", если PID совпадает, то не трогает, если не совпадает, то завершает его.
Вопрос - как это можно реализовать?
1) Возможно ли скрипт "Y" завершить, передав его PID приложению "Z" при его запуске из скрипта "Y"?
2) Возможно ли приложение "Z" сделать дочерним приложения "Y"? Или запустить как-то внутри GUI, чтобы класс не определялся, как консоль? Потому что любой Autoit скрипт скомпилированный в начала с опцией "Opt("TrayIconHide", 1)" не определяется скриптом "Х". Приложение "Z" на С++...
3) Приложение "X" работает не под правами администратора, возможно можно как-то запретить доступ приложения "X" к приложению "Z", чтобы не завершало процесс? С условием, что нельзя запускать приложение "Z" с правами администратора... И использовать права администратора в целом.
Это мои варианты размышлений над возможным решением проблемы. Естественно как реализовать не знаю, иначе бы не спрашивал и не надеялся на Ваш опыт) Спасибо заранее всем, кто попробует помочь)
Добавлено: нашел запуск .exe приложения внутри ГУИ по 2ому пункту. С помощью этого получилось обойти, но много мусорного кода. Пример:
Помогите пожалуйста сократить до минимума код, чтобы просто запускало в скрытом режиме консольное приложение "Z", по схеме выше. Или может все же еще другие интересные варианты предложений будут...
Еще нужно, чтобы при закрытие приложением "X" приложения "Y", приложение "Z" тоже выключалось. Т.е. добавить в приложение "Y" проверку, если его завершают к примеру через диспетчер задач, а не только через приложение "X", чтобы оно перед выключением, выключало приложение "Z", возможно ли это? Или как можно что-то подобное реализовать? Дочерним сделать, чтобы при любых вариантах закрытия "Y", закрывалось и "Z" в идеале.
Есть скрипт "X", который ищет запущенные консольные приложения, работающие в скрытом режиме и завершает их. Есть скрипт "Y", который является консольным приложением, которое скрипт "X" запускает в скрытом режиме, берет его PID для проверки и при сканирование на наличие запущенных консольных скрытых приложений не трогает его, сверяя PID.
Нужно из скрипта "Y" запустить консольное приложение "Z" с параметром @SW_HIDE и чтобы скрипт "X" его не трогал. Скрипт "Х" ищет приложения по классу "CLASS:ConsoleWindowClass", затем найденные приложения проверяет скрытое оно или нет, если скрытое, то сравнивает с PID приложения "Y", если PID совпадает, то не трогает, если не совпадает, то завершает его.
Вопрос - как это можно реализовать?
1) Возможно ли скрипт "Y" завершить, передав его PID приложению "Z" при его запуске из скрипта "Y"?
2) Возможно ли приложение "Z" сделать дочерним приложения "Y"? Или запустить как-то внутри GUI, чтобы класс не определялся, как консоль? Потому что любой Autoit скрипт скомпилированный в начала с опцией "Opt("TrayIconHide", 1)" не определяется скриптом "Х". Приложение "Z" на С++...
3) Приложение "X" работает не под правами администратора, возможно можно как-то запретить доступ приложения "X" к приложению "Z", чтобы не завершало процесс? С условием, что нельзя запускать приложение "Z" с правами администратора... И использовать права администратора в целом.
Это мои варианты размышлений над возможным решением проблемы. Естественно как реализовать не знаю, иначе бы не спрашивал и не надеялся на Ваш опыт) Спасибо заранее всем, кто попробует помочь)
Добавлено: нашел запуск .exe приложения внутри ГУИ по 2ому пункту. С помощью этого получилось обойти, но много мусорного кода. Пример:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPISysWin.au3>
Global $hEmbed
$hGUI = GUICreate('ProcessWinEmbed Example', 800, 600)
$hEmbed = _ProcessWinEmbed("1.exe", $hGUI, 0, 50)
Func _ProcessWinEmbed($sProgram, $hParent, $iLeft = -1, $iTop = -1)
Local $iPID = Run($sProgram, '', @SW_HIDE)
Local $aWinList, $hWnd
Local $iTimer = TimerInit()
While TimerDiff($iTimer) < 3000
$aWinList = WinList()
For $i = 1 To $aWinList[0][0]
If Not BitAND(WinGetState($aWinList[$i][1]), 2) And WinGetProcess($aWinList[$i][1]) = $iPID Then
$hWnd = $aWinList[$i][1]
ExitLoop 2
EndIf
Next
WEnd
If Not IsHWnd($hWnd) Then
Return SetError(1, 0, 0)
EndIf
Local $iStyle = _WinAPI_GetWindowLong($hParent, $GWL_STYLE)
_WinAPI_SetWindowLong($hParent, $GWL_STYLE, BitOR($iStyle, $WS_CLIPCHILDREN))
Local $aWinPos = WinGetClientSize($hParent)
Local $iExStyle = _WinAPI_GetWindowLong($hWnd, $GWL_EXSTYLE)
_WinAPI_SetWindowLong($hWnd, $GWL_EXSTYLE, BitOr($iExStyle, $WS_EX_MDICHILD))
_WinAPI_SetWindowLong($hWnd, $GWL_STYLE, $WS_POPUP)
_WinAPI_SetWindowPos($hWnd, 0, 0, 0, 0, 0, BitOR($SWP_SHOWWINDOW, $SWP_NOSIZE, $SWP_NOMOVE, $SWP_NOZORDER))
_WinAPI_SetParent($hWnd, $hParent)
WinMove($hWnd, '', ($iLeft = -1 ? 2.5 : $iLeft), ($iTop = -1 ? 2.5 : $iTop), $aWinPos[0] - ($iLeft = -1 ? 5 : $iLeft), $aWinPos[1] - ($iTop = -1 ? 5 : $iTop))
WinSetState($hWnd, '', @SW_SHOW)
Return $hWnd
EndFunc
Помогите пожалуйста сократить до минимума код, чтобы просто запускало в скрытом режиме консольное приложение "Z", по схеме выше. Или может все же еще другие интересные варианты предложений будут...
Еще нужно, чтобы при закрытие приложением "X" приложения "Y", приложение "Z" тоже выключалось. Т.е. добавить в приложение "Y" проверку, если его завершают к примеру через диспетчер задач, а не только через приложение "X", чтобы оно перед выключением, выключало приложение "Z", возможно ли это? Или как можно что-то подобное реализовать? Дочерним сделать, чтобы при любых вариантах закрытия "Y", закрывалось и "Z" в идеале.
Последнее редактирование: