Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
а можете подсказать как сделать проверку на процесс WorldOfTanks.exe
если процесс включен, то установить дальше не возможно, пока не выключишь игру
innot20, шапка => Показать/скрыть: Ссылки на примеры скриптов: => Запущен ли процесс (WMI), Запущен ли процесс
Когда же вы будете сами что-то искать?
Farser21
26-01-2014, 22:26
saurn , спасибо все работает!)
innot20,
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
[Files]
Source: ISTask.dll; DestDir: {app}; Flags: dontcopy
[Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
//**************************************************//
function InitializeSetup(): Boolean;
begin
If RunTask('WorldOfTanks.exe', false) then
begin
if MsgBox('Игра WorldOfTanks запущена. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('WorldOfTanks.exe');
Result:= True;
end else
Exit;
end;
Result:=True;
end;
Raf-9600
27-01-2014, 14:12
Ктонить может подсказать, как правильно через секцию [Cоde] попросить cmd.exe, чтобы он запустил определённый батник? При том чтобы консольное окно не появлялось.
Пробовал вот так:
Exec(ExpandConstant('{cmd}'), '/c start "Delete empty folders" "' + ExpandConstant('{app}\Delete empty folders.bat') + '"', ExpandConstant('{app}'), SW_HIDE, ewWaitUntilTerminated, ResultCode)
Но в таком случае окно консоли появляется и само не закрывается...
Raf-9600, батники можно запускать и без cmd, например так
Exec(ExpandConstant('{app}') + '\Delete empty folders.bat', '', '', SW_HIDE,
ewWaitUntilTerminated, ResultCode);
А можно из командной строки так
Exec(ExpandConstant('{cmd}'), '/C ' + ExpandConstant('{app}') + '\Delete empty folders.bat' , '', SW_HIDE, ewWaitUntilTerminated, i)
Второй способ я пользовала не для .bat, а для .cmd файлов, но по идее должно быть аналогично
diman_21Ru
27-01-2014, 14:52
делаю так чтобы удалить старые компоненты но выходит ошибка кто знает в чем проблема ?
[InstallDelete]
Type: filesandordirs; Name: "{app}\res_mods"; Check: IsChecked();
[Dirs]
Name: "{app}\res_mods"; Check: IsChecked();
Name: "{app}\res_mods\0.8.11 Common Test"; Check: IsChecked();
[code]
var
InfoPic: TBitmapImage;
LastIndex: Integer;
TempPath: String;
PicForm: TForm;
deleteChk: TCheckBox;
procedure InitializeWizard();
var
i, iCount: Integer;
begin
for i := iCount downto 0 do
WizardForm.ComponentsList.Checked[i]:= False;
deleteChk := TCheckBox.Create(nil);
with deleteChk do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0), ScaleY(115), ScaleX(400), ScaleY(15));
Caption := 'Удалить старые компоненты';
Checked := True;
function IsChecked(): Boolean;
begin
Result := deleteChk.Checked;
end;
TAY50N,какие строчки ты именно добавил чтобы наводя на мод выходила картинка с боку ? »[Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
UNDEF_INDEX = -777;
ALPHA_BLEND_LEVEL = 255; // max=Byte=255
WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
GWL_EXSTYLE = (-20);
var
InfoPic: TBitmapImage;
LastIndex: Integer;
TempPath: String;
PicForm: TForm;
type
COLORREF = DWORD;
function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';
//////Картинка описания//////////
procedure ShowPicHint(const PicFilePath: String);
var
pt: TPoint;
begin
if not GetCursorPos(pt) then Exit;
InfoPic.Bitmap.LoadFromFile(PicFilePath);
InfoPic.SetBounds(ScaleX(247), ScaleY(65), ScaleX(232), ScaleY(237));
InfoPic.Show;
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
UndefPic: String;
begin
if Index = -1 then Exit;
if Index = LastIndex then Exit;
try
case TNewCheckListBox(Sender).ItemCaption[Index] of
'Удаляем видео заставку': UndefPic := '1.bmp';
'Часы в Ангаре': UndefPic := '2.bmp';
'от zayaz': UndefPic := '3.bmp';
'от ZCH_0933': UndefPic := '4.bmp';
else
begin
LastIndex := UNDEF_INDEX;
InfoPic.Hide;
Exit;
end;
end;
if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
ShowPicHint(TempPath + UndefPic);
finally
LastIndex := Index;
end;
end;
procedure CompOnMouseLeave(Sender: TObject);
begin
InfoPic.Hide;
LastIndex := -1;
end;
procedure InitInfo();
begin
WizardForm.TypesCombo.Hide;
WizardForm.ComponentsList.SetBounds(ScaleX(0), ScaleY(63), ScaleX(240), ScaleY(240));
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
TempPath := AddBackslash(ExpandConstant('{tmp}'));
LastIndex := UNDEF_INDEX;
with TBevel.Create(WizardForm) do
begin
Parent := WizardForm.SelectComponentsPage;
SetBounds(ScaleX(245), ScaleY(63), ScaleX(235), ScaleY(240));
Shape := bsFrame;
end;
InfoPic := TBitmapImage.Create(WizardForm)
with InfoPic do
begin
Parent := WizardForm.SelectComponentsPage;
AutoSize := True;
end;
end;
diman_21Ru
27-01-2014, 15:01
TAY50N ,т.е второй надо делать а не как на первом ?
делаю так чтобы удалить старые компоненты но выходит ошибка кто знает в чем проблема ? »
А ничего странного в глаза не бросается? Вот тут:
procedure InitializeWizard();
var
i, iCount: Integer;
begin
for i := iCount downto 0 do
WizardForm.ComponentsList.Checked[i]:= False;
deleteChk := TCheckBox.Create(nil);
with deleteChk do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0), ScaleY(115), ScaleX(400), ScaleY(15));
Caption := 'Удалить старые компоненты';
Checked := True;
Здесь должны быть две логические скобки end;
function IsChecked(): Boolean;
begin
Result := deleteChk.Checked;
end;
diman_21Ru, вот:
http://forum.oszone.net/post-2296199-1941.html
Ему нужен этот вариант. Обрезанный, с измененным родителем изображений.[code]
const
UNDEF_INDEX = -777;
function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
var
InfoPic: TBitmapImage;
LastIndex: Integer;
TempPath: String;
procedure ShowPicHint(const PicFilePath: String);
var
pt: TPoint;
begin
if not GetCursorPos(pt) then Exit;
InfoPic.Bitmap.LoadFromFile(PicFilePath);
InfoPic.SetBounds(ScaleX(245), ScaleY(42), ScaleX(166), ScaleY(165));
InfoPic.Show;
end;
procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
UndefPic: String;
begin
if Index = -1 then Exit;
if Index = LastIndex then Exit;
try
case TNewCheckListBox(Sender).ItemCaption[Index] of
'Half-Life 2': UndefPic := 'Wasteland_Scanner_con.bmp';
'Half-Life 2 Episode One': UndefPic := 'Strider_early2.bmp';
'Half-Life 2 Episode Two': UndefPic := 'Cremator_poster.bmp';
'Portal': UndefPic := 'Portal.bmp';
else
begin
LastIndex := UNDEF_INDEX;
InfoPic.Hide;
Exit;
end;
end;
if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
ShowPicHint(TempPath + UndefPic);
finally
LastIndex := Index;
end;
end;
procedure CompOnMouseLeave(Sender: TObject);
begin
InfoPic.Hide;
LastIndex := -1;
end;
procedure InitInfo();
begin
WizardForm.TypesCombo.Hide;
WizardForm.ComponentsList.SetBounds(ScaleX(0), ScaleY(37), ScaleX(225), ScaleY(176));
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
TempPath := AddBackslash(ExpandConstant('{tmp}'));
LastIndex := UNDEF_INDEX;
with TBevel.Create(WizardForm) do
begin
Parent := WizardForm.SelectComponentsPage;
SetBounds(ScaleX(240), ScaleY(37), ScaleX(177), ScaleY(176));
Shape := bsFrame;
end;
InfoPic := TBitmapImage.Create(WizardForm)
with InfoPic do
begin
Parent := WizardForm.SelectComponentsPage;
AutoSize := True;
end;
end;
procedure InitializeWizard();
begin
InitInfo();
end;Хотя, если посмотреть сколько раз вопрос на эту тему был задан, и сколько раз на него ответили...
diman_21Ru
27-01-2014, 16:00
TAY50N , у меня она выходит на середину как бы мне можно тут все поменять т.к расширить низ верх и сделать попопам как тут ?
у меня она выходит на середину как бы мне можно тут все поменять т.к расширить низ верх и сделать попопам как тут ? »
Я код постом выше для кого выложил?
diman_21Ru
27-01-2014, 16:07
saurn ,ошибка выходит с deleteChk .
ошибка выходит с deleteChk »
Жуть. Давайте свой скрипт с минимальным набором файлов
diman_21Ru
27-01-2014, 16:16
saurn =) http://rghost.ru/51965901 вот убрал deleteChk это чтобы не было ошибки
Код:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
[Files]
Source: ISTask.dll; DestDir: {app}; Flags: dontcopy
[Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
//**************************************************//
function InitializeSetup(): Boolean;
begin
If RunTask('WorldOfTanks.exe', false) then
begin
if MsgBox('Игра WorldOfTanks запущена. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('WorldOfTanks.exe');
Result:= True;
end else
Exit;
end;
Result:=True;
end; »
а не подскажите как ещё это сделать не окном, а отдельной странице после выбора компонентов
если процесс не выключен, то при нажатии далее не будет ничего происходить пока не выключишь процесс
diman_21Ru, скрипт во вложении.
пока не выключишь процесс »
В смысле, чтоб процесс пользователю руками выключать надо было?
Попробуй так
[code]
const
TH32CS_SNAPPROCESS = $2;
INVALID_HANDLE_VALUE = -1;
type
TPROCESSENTRY32 = record
dwSize, cntUsage, th32ProcessID: DWORD;
th32DefaultHeapID: Longint;
th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
pcPriClassBase: Longint;
dwFlags: DWORD;
szExeFile: array [0..259] of char;
end;
var Page:TOutputMsgWizardPage;
function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): Boolean; external 'CloseHandle@kernel32.dll stdcall';
function IsProcessRunning(FileName: String): Boolean; //FileName - имя exe-файла процесса
var
hProcessSnap: THandle;
pe32: TPROCESSENTRY32;
szExeFile: String;
begin
hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
pe32.dwSize := sizeof(pe32);
if not Process32First(hProcessSnap, pe32) then Exit;
while not Result and Process32Next(hProcessSnap, pe32) do
begin
szExeFile := '';
while not (pe32.szExeFile[Length(szExeFile)] = #0) do szExeFile := szExeFile + pe32.szExeFile[Length(szExeFile)];
Result := LowerCase(FileName) = LowerCase(szExeFile);
end;
CloseHandle(hProcessSnap);
end;
procedure InitializeWizard;
begin
Page:=CreateOutputMsgPage(wpSelectComponents, "Внимание", "Игра WorldOfTanks запущена", "Игра WorldOfTanks запущена. Закройте, чтобы продолжить установку");
end;
function NextButtonClick(CurPageID: Integer): Boolean;
begin
if (CurPageID= Page.id) then
begin
if IsProcessRunning('WorldOfTanks.exe') then
result:=false
else
result:=true;
end
else
result:=true;
end;
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.