我正在尝试使用INNO编写安装程序脚本,而且我被困在了一个需要获取安装程序运行的机器的屏幕分辨率的位置,并使用该值在桌面上以该分辨率创build一个快捷方式的论点。 我知道如何创build一个快捷方式,但是我不知道如何提取屏幕分辨率以及如何将这些信息(可能存储在一个自定义variables中)传递给桌面快捷方式。
谢谢你的时间 :)
编辑:我不能改变应用程序,因为我没有被授权这样做。 所以请不要这样做。
我的解决方案是使用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。 改变了代码以反映这一点。
你需要一些代码来获得当前的分辨率。 然后,您可以将这些值添加到[图标]条目来创建快捷方式。 这里有一些代码让你开始:
[Setup] AppName=DisplayResoltution AppVerName=DisplayResoltution DefaultDirName=DisplayResoltution DisableStartupPrompt=true Uninstallable=false [Files] Source: "C:\util\innosetup\Examples\MyProg.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;
代码改编自http://www.vincenzo.net/isxkb/index.php?title=Detect_current_display_resolution_and_color_depth