Делается с помощью плагина nsProcess
.
1. Качаем архив
2. Распаковываем содержимое архива по соответствующим каталогам NSIS
NsProcess.zip\Example --> C:\Program Files (x86)\NSIS\Examples\nsProcess
NsProcess.zip\Include --> C:\Program Files (x86)\NSIS\Include\
NsProcess.zip\Plugin\nsProcess.dll --> C:\Program Files (x86)\NSIS\Plugins\x86-ansi\nsProcess.dll
NsProcess.zip\Plugin\nsProcessW.dll --> C:\Program Files (x86)\NSIS\Plugins\x86-unicode\nsProcess.dll
Начало:
Unicode true
!include LogicLib.nsh
Name "KillProcessExample"
OutFile "KillProcessExample.exe"
ShowInstDetails show
RequestExecutionLevel User
Немного дополнил пример из официального мануала, вставив макрос для расширенного вывода сообщений об ошибках:
!macro PrintProcError ErrCode
Код разлапистый, потому на PasteBin: !macro PrintProcError ErrCode
Код внутри секции:
1. Запускаем тестовую программу (calc.exe
, которая обычно есть в любой винде и лежит она обычно в $SYSDIR
, т.е. в C:\Windows\System32\
) и ждем 500 миллисекунд:
DetailPrint "Start calc.exe..."
Exec "$SYSDIR\calc.exe"
Sleep 500
2. Спрашиваем у пользователя, будем ли убивать процесс. Если нет — идем на завершение:
MessageBox MB_YESNO|MB_ICONQUESTION "Kill process calc.exe?" IDYES 0 IDNO "EndProg"
3. Ищем процесс(ы) по имени экзешника:
DetailPrint "Find process calc.exe..."
nsProcess::_FindProcess "calc.exe"
Да, можно хоть 10 калькуляторов назапускать.
4. Вытаскиваем из стека результат функции _FindProcess
:
Pop $R0
5. Выводим на псевдоконсоль расшифровку кодов возврата:
!insertmacro PrintProcError $R0
6. Если код возврата = 0
, значит, процесс найден, пытаемся его убить, выводим расшифровку кодов возврата, и опять подождем 500 миллисекунд:
${If} $R0 = 0 DetailPrint "Process calc.exe found. Kill it..." nsProcess::_KillProcess "calc.exe" !insertmacro PrintProcError $R0 Sleep 500 ${EndIf}
— Официальная справка плагина (на буржуйском)
— Перевод от Leha Silent (копия)