0

Ive пытался обнаружить процесс excel в моем установщике установки. У меня есть пользовательское действие, которое запускается после appsearch и появляется окно, если оно находит процесс и выводит предупреждение пользователю.Как я могу использовать installscript для обнаружения работы Excel.exe?

Я попытался использовать некоторые старые примеры, которые я нашел на сайте installsite.org, и используя вызов findWindow(). Ничего не найдено в списке процессов excel.exe.

Вот фрагмент кода, который я использую, когда попробовав FindWindow

export prototype MyTestFunction(HWND); 

function MyTestFunction(hMSI) 
HWND nHwnd; 
begin 
    nHwnd = FindWindow("EXCEL", ""); 
    if (nHwnd != 0) then 
    MessageBox("found excel", WARNING); 
    SendMessage(nHwnd, WM_CLOSE, 0, 0); 
    else 
    MessageBox("cant find excel", WARNING); 
    endif; 

end; 

Обратите внимание, что только блок еще когда-либо, кажется, срабатывает независимо от приложения, будучи открытыми или закрытыми.

Я пробовал несколько различных вариантов этого, в основном, просто заменяя «excel» разной капитализацией, расширениями и версиями. Кажется, ничего не обнаружено. Я использовал Spy ++, и он сообщил, что окно названо в честь имени текущего открытого ноутбука, что усложняет ситуацию, поскольку я не знаю, что пользователь мог открыть.

Я открыт для предложений здесь. Единственное требование для этого решения состоит в том, что он должен быть выполнен как пользовательское действие или часть условия установки из Installshield.

ответ

0

Очевидно, пытаясь выяснить, работает ли процесс, находя связанное окно, имеет свои подводные камни.

Мое предложение состоит в том, чтобы определить, работает ли процесс для Excel.exe. Это будет включать перечисление процессов в системе. Измените свой код соответствующим образом. Его проще сделать с помощью C++, но есть множество доступных примеров, которые показывают, как достичь того, что я только что сказал.

https://community.flexerasoftware.com/archive/index.php?t-162141.html

https://community.flexerasoftware.com/archive/index.php?t-188807.html

Возьмите

1

Вы можете использовать VBScript Custom Action. Вы можете запустить этот ЦС в начале UISequence или ExecuteSequence (или обоих). Если вы хотите, чтобы это было частью условия установки. Добавьте код в функцию vbscript и настройте опцию «Обработка возврата» для пользовательского действия «Синхронный (Check exit code)», если вы хотите остановить процесс установки.

Вот мой сценарий:

Public Function StopProcess 

Dim objWMIService, objProcess, colProcess 
Dim strComputer, executableFileName 
Const IDABORT = 3  

strComputer = "." 
executableFileName = "excel.exe" 

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colProcess = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & executableFileName & "'") 

For Each objProcess in colProcess 
    objProcess.Terminate() 
    ' OR 
    StopProcess = IDABORT 
    Exit for 
Next 
End function 
+0

Что делать, если открыт важный файл? , дать пользователю возможность закрыть свои файлы –

0

Мы можем написать код InstallScript, а также для достижения этой цели. Пожалуйста, ознакомьтесь со следующим кодом:

function CheckRunningProcessAndTerminate(hMSI) 
// To Do: Declare local variables. 
OBJECT wmi,objProc; 
STRING szProcessName; 

begin 
// To Do: Write script that will be executed when MyFunction is called. 
szProcessName = "Excel.exe"; 

set wmi = CoGetObject("winmgmts://./root/cimv2", ""); 
set objProc = wmi.ExecQuery("Select * from Win32_Process where Name = '" + szProcessName + "'"); 

if (objProc.count > 0) then 
    MessageBox("Process is running.", INFORMATION); 
    //kill proces 
    TerminateProcesses(szProcessName); 
    //objProc.Terminate(); //I tried this, but it didn't worked. 
else 
    MessageBox("Process is not running.", INFORMATION); 
endif; 

end;