#windows #inno-setup
#Windows #inno-setup
Вопрос:
Я пытаюсь создать скрипт установки с помощью INNO и застрял на том этапе, когда мне нужно получить разрешение экрана компьютера, на котором запущена программа установки, и использовать это значение для создания ярлыка на рабочем столе с этим разрешением в качестве одного из аргументов. Я знаю, как создать ярлык, однако я не знаю, как извлечь разрешение экрана и как передать эту информацию (возможно, сохраненную в пользовательской переменной), чтобы использовать ее в ярлыке на рабочем столе.
Спасибо за ваше время 🙂
РЕДАКТИРОВАТЬ: я не могу изменить приложение, потому что у меня нет на это полномочий. Поэтому, пожалуйста, не предлагайте этого делать.
Комментарии:
1. Я удалил свой ответ, поскольку вы ясно дали понять, что не можете изменить приложение. Примите мои соболезнования. Кажется, что люди, работающие над приложением, обладают всей властью, и они злоупотребляют этой властью.
Ответ №1:
Моим решением было использовать GetSystemMetrics()
, которое можно найти в user32.dll. Этот фрагмент кода дает мне именно то, что я хочу, и был протестирован на Windows7 Professional (64-разрядная версия) с настройкой на два монитора.
[Code]
function GetSystemMetrics (nIndex: Integer): Integer;
external 'GetSystemMetrics@User32.dll stdcall setuponly';
Const
SM_CXSCREEN = 0; // The enum-value for getting the width of the cient area for a full-screen window on the primary display monitor, in pixels.
SM_CYSCREEN = 1; // The enum-value for getting the height of the client area for a full-screen window on the primary display monitor, in pixels.
function InitializeSetup(): Boolean;
var
hDC: Integer;
xres: Integer;
yres: Integer;
begin
xres := GetSystemMetrics(SM_CXSCREEN);
yres := GetSystemMetrics(SM_CYSCREEN); //vertical resolution
MsgBox( 'Current resolution is ' IntToStr(xres)
'x' IntToStr(yres)
, mbInformation, MB_OK );
Result := true;
end;
РЕДАКТИРОВАТЬ: Кажется, индексы должны были быть SM_CXSCREEN и SM_CYSCREEN. Изменен код, чтобы отразить это.
Комментарии:
1. Отличное решение, большое спасибо! Все еще действует на Win Srv Std 2012 x64 🙂
Ответ №2:
Для получения текущего разрешения вам понадобится некоторый код. Затем вы можете добавить эти значения к записи [Значок], чтобы создать ярлык. Вот некоторый код, который поможет вам начать:
[Setup]
AppName=DisplayResoltution
AppVerName=DisplayResoltution
DefaultDirName=DisplayResoltution
DisableStartupPrompt=true
Uninstallable=false
[Files]
Source: "C:utilinnosetupExamplesMyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{group}My Program"; Filename: "{app}MyProg.exe"; Parameters: {code:GetParams}
[Code]
// Functions to get BPP amp; resolution
function DeleteDC (hDC: Integer): Integer;
external 'DeleteDC@GDI32 stdcall';
function CreateDC (lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
external 'CreateDCA@GDI32 stdcall';
function GetDeviceCaps (hDC, nIndex: Integer): Integer;
external 'GetDeviceCaps@GDI32 stdcall';
Const
HORZRES = 8; //horizontal resolution
VERTRES = 10; //vertical resolution
BITSPIXEL = 12; //bits per pixel
PLANES = 14; //number of planes (color depth=bits_per_pixel*number_of_planes)
var
xres, yres, bpp, pl, tmp: Integer;
function InitializeSetup(): Boolean;
var
hDC: Integer;
begin
//get resolution amp; BPP
hDC := CreateDC('DISPLAY', '', '', 0);
pl := GetDeviceCaps(hDC, PLANES);
bpp := GetDeviceCaps(hDC, BITSPIXEL);
xres := GetDeviceCaps(hDC, HORZRES); //horizontal resolution
yres := GetDeviceCaps(hDC, VERTRES); //vertical resolution
tmp := DeleteDC(hDC);
bpp := pl * bpp; //color depth
MsgBox( 'Current resolution is ' IntToStr(xres)
'x' IntToStr(yres)
' and color depth is ' IntToStr( bpp )
, mbInformation, MB_OK );
Result := true;
end;
function GetParams(def: string): string;
var
sTemp : string;
begin
sTemp := 'xres=' IntToStr(xres) ' yres=' IntToStr(yres);
result := sTemp;
end;
Код, адаптированный из http://www.vincenzo.net/isxkb/index.php?title=Detect_current_display_resolution_and_color_depth
Комментарии:
1. привет, миртейл, спасибо за ответ. Я должен быть в состоянии протестировать это сегодня. Пожалуйста, не обращайте внимания на то, что я не смог проверить это раньше.
2. Я попробовал ваш код, и он показывает
Current resolution is 0x0 and color depth is 0
3. Какая ОС? Я попробовал это на Win7 x64, и у меня это сработало. Вы пробовали это на каких-либо других компьютерах?
4. Я также пробую это на Win7 x64. Но я получил результат, используя
GetSystemMetrics()
из User32.dll используя индексы SM_CXFULLSCREEN и SM_CYFULLSCREEN. У меня есть одно отличие от вашей системы (вероятно); моя система настроена на два монитора. Я не знаю, является ли это причиной проблемы. И в моем решении гораздо меньше кода.