Ver Mensaje Individual
  #1  
Antiguo 29-08-2022
ramonibk ramonibk is offline
Miembro
 
Registrado: may 2004
Posts: 193
Reputación: 21
ramonibk Va por buen camino
Resolución pantalla

Hola a todos.
mi problema reside que en unos equipos muy viejos que se han colocado unos ordenadores nuevos con win10 sin tener en cuenta que los monitores son de hace 15 años, un cable VGA de 5 metros y una aplicación que corre en 800x600.
el problema principal es que los ordenadores arrancan en 1024x768 y al estar deseabilidad el escritorio no es fácil el cambio de resolución. por esto se opto en un primer momento por usar "nircmd" para la reconfiguración de monitor.
pero me esta surgiendo un problema de sincronismos que me deja la pantalla desplazada y hay que cortar físicamente la alimentación al monitor para que este se re-sincronice.

por mi parte he probado a hacer una pequeña aplicación en Delphi para forzar la resolución y apagar y encender la pantalla.

Código Delphi [-]
program Monitor;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, Winapi.Windows, Winapi.Messages, StrUtils;

var
  lpDevMode: TDeviceMode;
  X, Y, Hz : word;
  SizeX, SizeY, SizeHz : Integer;
  i : Integer;

function CambiarResolucion (XScreem, YScreem, HzScreem : word): BOOL;
begin
  Result := EnumDisplaySettings(nil, 0, lpDevMode);
  if Result then
  begin
    lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT;
    lpDevMode.dmPelsWidth := XScreem;
    lpDevMode.dmPelsHeight := YScreem;
    lpDevMode.dmDisplayFrequency := HzScreem;
    Result := ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL and DISP_CHANGE_RESTART;
  end;
end;

begin
  try
   SizeX := GetSysTemMetrics(SM_CXSCREEN);
   SizeY := GetSysTemMetrics(SM_CYSCREEN);
   SizeHz := GetSysTemMetrics(SM_CXDLGFRAME);

   If ParamStr(1) = '' Then
    Begin
      Writeln ('Resolución actual: '+IntToStr(SizeX) +' x '+ IntToStr(SizeY));
    End;

   If ParamStr(1) = 'display' Then
    Begin
     X := StrToInt(ParamStr(2));
     Y := StrToInt(ParamStr(3));
     if ParamStr(4) <> '' Then
      Hz := StrToInt(ParamStr(4));
     if ParamStr(4) = '' Then
      Hz := 59;

     if (SizeX <> X) and (SizeY <> Y) then
      Begin
        CambiarResolucion (X, Y, Hz);
      End else
       Writeln ('La resolución actual coincide con la indicada, No es necesario realizar cambios.');

    End;

    If ParamStr(1) = 'monitor' Then
    Begin
     If ParamStr(2) = 'off' Then
       SendMessage(GetForegroundWindow(), WM_SYSCOMMAND, SC_MONITORPOWER, 2);
     If ParamStr(2) = 'On' Then
       SendMessage(GetForegroundWindow(), WM_SYSCOMMAND, SC_MONITORPOWER, -1);
    End;


  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.
con un fichero .bat apago la pantalla la enciendo y fuerzo la resolución antes de que arranque la aplicación principal. pero me he encontrado con el problema de aunque mande encender al monitor este se queda en negro hasta que se toque el ratón o alguna tecla lo cual no me vale.

a alguien se le ocurre algún método para solucionar esto.

Un saludo.
Responder Con Cita