windows - INNO Setup: Hvordan får man den primære skærmens opløsning?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at scribe et installationsprogram med INNO, og jeg sidder fast på et punkt, hvor jeg skal hente skærmopløsningen af ​​maskinen, hvor opsætningen kører, og bruge den værdi til at oprette en genvej på skrivebordet med den opløsning som en af argumenterne. Jeg ved, hvordan man opretter en genvej, men jeg ved ikke, hvordan man udpakker skærmopløsningen og hvordan man overfører disse oplysninger (sandsynligvis gemt i en brugerdefineret variabel) for at bruge den i skrivebordsgenvejen.


Tak for din tid :)


EDIT: Jeg kan ikke ændre ansøgningen, fordi jeg ikke har tilladelse til at gøre det. Så vær venlig at foreslå ikke.

Bedste reference


Min løsning på dette var at bruge GetSystemMetrics(), som kan findes i user32.dll. Dette stykke kode giver mig præcis det, jeg vil have og er blevet testet på Windows7 Professional (64-bit) med en dual-monitor setup.


[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;


EDIT : Det ser ud til, at indekserne skal have været SM\_CXSCREEN og SM\_CYSCREEN. Ændret koden for at afspejle det.

Andre referencer 1


Du har brug for en kode for at få den nuværende opløsning, så du kan tilføje disse værdier til [[Ikon]] for at oprette genvejen. Her er en kode for at komme i gang:


[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 & 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 & 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;


Kode tilpasset fra http://www.vincenzo.net/isxkb/index.php?title=Detect\_current\_display\_resolution\_and\_color\_depth[4]