2010-04-02 41 views

Trả lời

1

Tùy thuộc vào ứng dụng, bạn có một vài lựa chọn:

  • Nếu ứng dụng của bạn có một cửa sổ với một tên lớp hơi duy nhất, bạn có thể sử dụng FindWindow
  • Nếu ứng dụng của bạn tạo ra một đối tượng hạt nhân tên (Mutex vv), bạn có thể kiểm tra nó bằng cách gọi đúng bản win32 API với các plugin hệ thống
  • Sử dụng một plugin bên thứ 3 như FindProcDLL
+0

FindProcDLL sẽ không làm việc với phiên bản cuối cùng của NSIS như các nhận xét này, 2,46, phát hành vào năm 2009. – Rex

+3

Một lựa chọn khác là thế này: 'ExecWait taskkill/IM program_name/F' –

7

Sử dụng plugin NsProcess. Tải xuống tại đây ->NSProcess
Cách sử dụng? Đơn giản như:

${nsProcess::KillProcess} "${APP_EXE}" $R4 

nơi APP_EXE là tên của ứng dụng của bạn ...

Các tải cũng sẽ cho bạn biết làm thế nào để sử dụng nó ... :)

7

Đây là một nhẹ hơn phiên bản thân thiện với người sử dụng NSProcess rằng yêu cầu các ứng dụng để đóng chứ không phải là chấm dứt nó (Owen câu trả lời)

${nsProcess::FindProcess} "${APP_EXE}" $R0 

${If} $R0 == 0 
    DetailPrint "${AppName} is running. Closing it down" 
    ${nsProcess::CloseProcess} "${APP_EXE}" $R0 
    DetailPrint "Waiting for ${AppName} to close" 
    Sleep 2000 
${Else} 
    DetailPrint "${APP_EXE} was not found to be running"   
${EndIf}  

${nsProcess::Unload} 
+0

Giải pháp tốt nhất! – MiBol

0

Chỉ cần chắc chắn rằng điều đầu tiên mà cài đặt hoặc un-i nstall không phải là để xóa tất cả các tập tin xyz.tmp trong% TEMP (hoặc bất kỳ thư mục ghi ứng dụng khác) trước khi dưới đây cho vòng lặp chạy. Không cần plugin.

!macro IsRunning 
    ExecWait "cmd /c for /f $\"tokens=1,2$\" %i in ('tasklist') do (if /i %i EQU xyz.exe fsutil file createnew $TEMP\xyz.tmp 0)" 
    IfFileExists $TEMP\xyz.tmp 0 notRunning 
    ;we have atleast one main window active 
    MessageBox MB_OK|MB_ICONEXCLAMATION "XYZ is running. Please close all instances and retry." /SD IDOK 
    Abort 
    notRunning: 
!macroEnd 
Các vấn đề liên quan