program res; (* Prints and changes current resolutio. For usage see isHelp. Vesa Lappalainen 19.1.2008 *) {$APPTYPE CONSOLE} uses SysUtils,Windows, Messages; function isHelp(s:string):boolean; begin Result := false; s := UpperCase(s); if ( Pos('?',s) = 0 ) and ( Pos('H',s) = 0 ) and ( Pos('A',s) = 0 ) then exit; writeln('res: Prints allways the current resolution'); writeln(' With parameters changes display resolution.'); writeln(''); writeln('Syntax: res width height bitsperpixel'); writeln(''); writeln('Value 0 means original value, - is current value'); writeln('Example: res 1024 768 16 - changes height to 1024x768 with 16 bits'); writeln('Example: res - 600 - changes height to 600 (if mode is possible)'); writeln('Example: res 0 0 8 - changes resolution to original, color depth to 8 bit/pixel'); writeln('Example: res - - 8 - just change color depth to 8 bit/pixel'); writeln('Example: res org - returns original resolution and color depth'); writeln('Example: res mode - prints all possible modes'); writeln('Example: res - just print current resolution'); writeln(''); writeln('Vesa Lappalainen 19.1.2008'); Result := true; end; function isModes(s:string;var devcur : TDeviceMode):boolean; var dev :TDeviceMode; mode : integer; ch:String; begin Result := false; s := UpperCase(s); if ( Pos('M',s) = 0 ) then exit; dev.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL; mode := 0; while ( EnumDisplaySettings(PChar(nil),mode,dev) ) do begin ch := ' '; if ( dev.dmPelsWidth = devcur.dmPelsWidth ) and ( dev.dmPelsHeight = devcur.dmPelsHeight ) and ( dev.dmBitsPerPel = devcur.dmBitsPerPel ) then ch := '<=='; writeln(format('%2d: %4d %4d %2d %s',[mode,dev.dmPelsWidth,dev.dmPelsHeight,dev.dmBitsPerPel,ch])); inc(mode); end; Result := true; end; function isOriginal(s:string):boolean; begin Result := false; s := UpperCase(s); if ( Pos('O',s) = 0 ) then exit; ChangeDisplaySettings(PDeviceModeA(nil)^,0); //SendMessage(HWND_BROADCAST, WM_DISPLAYCHANGE, SPI_SETNONCLIENTMETRICS,0); Result := true; end; procedure getCurrent(var dev:TDeviceMode); var dc : HDC; begin dc := GetDC(0); dev.dmPelsWidth := GetDeviceCaps(dc, HORZRES); dev.dmPelsHeight := GetDeviceCaps(dc, VERTRES); dev.dmBitsPerPel := GetDeviceCaps(dc, BITSPIXEL); ReleaseDC(0, dc); //writeln(format('Current %2d: %4d x %4d / %2d',[0,mode.width,mode.height,mode.bpp])); writeln(format(' %4d %4d %2d',[dev.dmPelsWidth,dev.dmPelsHeight,dev.dmBitsPerPel])); end; var dev :TDeviceMode; ret : longint; begin getCurrent(dev); if ( ParamCount = 0 ) then exit; if ( isHelp(ParamStr(1)) ) then exit; if ( isModes(ParamStr(1),dev) ) then exit; if ( isOriginal(ParamStr(1)) ) then exit; dev.dmPelsWidth := StrToIntDef(ParamStr(1),dev.dmPelsWidth); dev.dmPelsHeight := StrToIntDef(ParamStr(2),dev.dmPelsHeight); dev.dmBitsPerPel := StrToIntDef(ParamStr(3),dev.dmBitsPerPel); dev.dmSize := Sizeof(dev); dev.dmFields := 0; if ( dev.dmPelsWidth > 0 ) then dev.dmFields := dev.dmFields or DM_PELSWIDTH; if ( dev.dmPelsHeight > 0 ) then dev.dmFields := dev.dmFields or DM_PELSHEIGHT; if ( dev.dmBitsPerPel > 0 ) then dev.dmFields := dev.dmFields or DM_BITSPERPEL; ret := ChangeDisplaySettings(dev,0); if ( ret = DISP_CHANGE_SUCCESSFUL ) then begin //SendMessage(HWND_BROADCAST, WM_DISPLAYCHANGE, SPI_SETNONCLIENTMETRICS,0); exit; end; if ( ret = DISP_CHANGE_RESTART ) then writeln('The computer must be restarted in order for the graphics mode to work.'); if ( ret = DISP_CHANGE_BADFLAGS ) then writeln('An invalid set of flags was passed in.'); if ( ret = DISP_CHANGE_FAILED ) then writeln('The display driver failed the specified graphics mode.'); if ( ret = DISP_CHANGE_BADMODE ) then writeln('The graphics mode is not supported.'); if ( ret = DISP_CHANGE_NOTUPDATED ) then writeln('Unable to write settings to the registry'); writeln('Use: res mode to list all modes'); end.