Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-08-2022
ramonibk ramonibk is offline
Miembro
 
Registrado: may 2004
Posts: 193
Poder: 20
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
  #2  
Antiguo 29-08-2022
lucho6007 lucho6007 is offline
Miembro
 
Registrado: ene 2009
Ubicación: Junín, pcia de BsAs, Argentina
Posts: 74
Poder: 16
lucho6007 Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 29-08-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Y por qué no configuras el windows para que funcione a 800x600?
Responder Con Cita
  #4  
Antiguo 29-08-2022
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #5  
Antiguo 30-08-2022
ramonibk ramonibk is offline
Miembro
 
Registrado: may 2004
Posts: 193
Poder: 20
ramonibk Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Resolución de la pantalla washiloo C++ Builder 3 23-09-2011 18:20:40
Resolucion de Pantalla shoulder Varios 3 05-10-2010 21:35:53
Resolucion de pantalla Willer OOP 7 30-04-2010 01:42:22
Resolucion de pantalla oregon Windows 1 22-03-2007 15:09:43
Resolución de pantalla kalimero Varios 8 05-11-2003 21:41:47


La franja horaria es GMT +2. Ahora son las 17:48:25.


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
Copyright 1996-2007 Club Delphi