Что нового

Передать другому приложению свой PID или возможно как-то по другому...

fixij

Новичок
Сообщения
2
Репутация
0
Всем привет. Решил написать сюда, т.к. уже сломал голову, что можно бы сделать...
Есть скрипт "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" в идеале.
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
97
Репутация
12
Немножко подтолкну в сторону _WinAPI_EnumChildProcess, т.е. с его помощью в процессе X получаешь его дочерние процессы и их не трогаешь, перед закрытием процесса X закрываешь принудительно его дочерние, полученные через _WinAPI_EnumChildProcess. Расписать код, нет времени, так как сегодня в ночь на работу, нужно отдыхать. Ковыряй справку (autoit v3.3.14.5), раздел User Defined Function Reference > WinAPIEx Reference > Processes & Synchronization Reference > Processes Management
 
Автор
F

fixij

Новичок
Сообщения
2
Репутация
0
Немножко подтолкну в сторону _WinAPI_EnumChildProcess, т.е. с его помощью в процессе X получаешь его дочерние процессы и их не трогаешь, перед закрытием процесса X закрываешь принудительно его дочерние, полученные через _WinAPI_EnumChildProcess. Расписать код, нет времени, так как сегодня в ночь на работу, нужно отдыхать. Ковыряй справку (autoit v3.3.14.5), раздел User Defined Function Reference > WinAPIEx Reference > Processes & Synchronization Reference > Processes Management
Скрипт "Х" нет возможности редактировать и изменять. Если бы была такая возможность, то я бы не делал такие костыли) Нужно именно в скрипте "Y" реализовать эту "прокладку". Как обойти поиск по консольному окну и убийство процесса - нашел, хотя может и не самое лучшее решение, я не так хорошо владею знаниями в этом. А вот как теперь сделать, чтобы когда скрипт "X" убивает процесс скрипта "Y", чтобы скрипт "Y" это понял и убил процесс программы "Z" перед закрытием, либо, чтобы программа "Z" завершила свою работу, т.к. зависима от процесса скрипта "Y", возможно как-то запустить дочерне, вот тут не знаю. Процесс скрипта "Y" именно убивается, нет возможности использовать "OnAutoItExitRegister"

Добавлено: пока из идей пришел на ум вариант добавить еще скрипт "E", который будет запускаться скриптом "Y". Скрипт "Y" при запуске скрипта "E" будет передавать ему свой PID и PID скрипта "Z", таким образом скрипт "E" будет просто отслеживать работу скрипта "Y". И когда скрипт "X" завершит скрипт "Y", то скрипт "E" это отследит и завершит работу программы "Z", и сам выключится. Такие вот костыли придумал... Если лучшим вариантом не поможете)
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
97
Репутация
12
Можно создать скрипт который запустит ваши скрипты X, Y и Z, после чего этот скрипт просто мониторит эти процессы и в случае закрытия одного, убивает и другие или перезапускает их.
 
Верх