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.