Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Resolución pantalla (https://www.clubdelphi.com/foros/showthread.php?t=95844)

ramonibk 29-08-2022 13:39:54

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.

lucho6007 29-08-2022 14:52:43

Simula movimiento del mouse
 
Hola!
Podés simular el movimiento del mouse, o algún clic con el siguiente código:
SetCursorPos(20, Screen.Height-20); //set cursor to Start menu coordinates mouse_event(MOUSEEVENTF_LEFTDOWN,0, 0, 0, 0); //press left button mouse_event(MOUSEEVENTF_LEFTUP,0, 0, 0, 0); //release left button

Saludos

Casimiro Notevi 29-08-2022 17:49:11

¿Y por qué no configuras el windows para que funcione a 800x600?

escafandra 29-08-2022 19:00:18

Código Delphi [-]
// Monitor power on
SendNotifyMessage(GetForegroundWindow(), WM_SYSCOMMAND, SC_MONITORPOWER, -1);
for i:= 0 to 4 do
begin
    mouse_event(MOUSEEVENTF_MOVE, 0, 10, 0, 0);
    Sleep(40);
    mouse_event(MOUSEEVENTF_MOVE, 0, DWORD(-10), 0, 0);
end;


Saludos.

ramonibk 30-08-2022 07:36:56

Hola Casimiro. No puedo dejar la resolución en 800x600 fija. pues debido a las características de win10 si el monitor se cambia. este intentara reconfigurarse a su mejor resolución. y no confió en que todos los técnicos sean capaces de "Entrar en el registro, Modificar claves, reiniciar en escritorio, cambiar resolución, entrar en registro, volver las claves a su posición original, y reiniciar nuevamente el pc"
de echo he intentado generar ficheros de registro y ha sido un caos.

Gracias Escafandra he incrementado tu parte de código y en principio en laboratorio me ha funcionado correctamente.
solo me queda probarlo en campo y ver como va la cosa.

Muchas gracias a todos y os mantengo informados.


La franja horaria es GMT +2. Ahora son las 01:34:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi