Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-12-2013
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 19
look Va camino a la fama
Capturar imagen de ventana inactiva

Hola amigos, estoy desarrollando un pequeño programa para control remoto, tengo una aplicacion cliente y una server, la aplicacion cliente manda una peticion cada segundo al servidor y este le manda al cliente una imagen de una ventana todo esto por medio de sockets, esto funcionan bien, el problema es que al bloquear la sesion ("WIN+L") , la aplicacion cliente conecta bien pero de alguna manera la imagen de capatura que envia se vuelve en blanco, he probado con varias funciones para capturar la imagen pero creo que el problema no va por ahi, pareciera que al bloquear la sesion la ventana queda inactiva... .
lo que quiero hacer es que se puede capturar la imagen de la ventana aun bloqueada la session, me parece extraño ya que la aplicacion cliente conecta bien con la aplicacion server.
Código Delphi [-]
procedure ScreenShot(activeWindow: bool; destBitmap : TBitmap ; hWin : Cardinal) ;
 var
    w,h : integer;
    DC : HDC;
    r : TRect;
 begin
    if activeWindow then
    begin
      hWin := GetForegroundWindow;
      hWin := GetForegroundWindow;
      dc := GetWindowDC(hWin) ;
      GetWindowRect(hWin,r) ;
      w := r.Right - r.Left;
      h := r.Bottom - r.Top;
    end
    else
    begin
      hWin := GetDesktopWindow;
      dc := GetDC(hWin) ;
      w := GetDeviceCaps (DC, HORZRES) ;
      h := GetDeviceCaps (DC, VERTRES) ;
    end;
    try
     destBitmap.Width := w;
     destBitmap.Height := h;
     BitBlt(destBitmap.Canvas.Handle,
            0,
            0,
            destBitmap.Width,
            destBitmap.Height,
            DC,
            0,
            0,
            SRCCOPY) ;
    finally
     ReleaseDC(hWin, DC) ;
    end;
 end;
__________________
all your base are belong to us
Responder Con Cita
  #2  
Antiguo 31-12-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola look.

Tal vez te sirva impedir el bloqueo durante la duración de tu programa 'cliente' y restaurar la condición al finalizar, algo como:
Código Delphi [-]
implementation

uses Registry;

var
  PrevLockState: Boolean;

function LockWorkstationState: Boolean;
var
  r: TRegistry;
begin
  Result := False;
  with TRegistry.Create do
  try
    RootKey := HKEY_CURRENT_USER;
    if OpenKey('\Software\Microsoft\Windows\CurrentVersion\Policies\System', False) then
    begin
      Result := Boolean(ReadInteger('DisableLockWorkstation'));
      CloseKey;
    end;
  finally
    Free;
  end;
end;

procedure DisableLockWorkstation(Lock: Boolean);
begin
  with TRegistry.Create do
  try
    RootKey := HKEY_CURRENT_USER;
    if OpenKey('\Software\Microsoft\Windows\CurrentVersion\Policies\System', True) then
    begin
      WriteInteger('DisableLockWorkstation', Integer(Lock));
      CloseKey;
    end;
  finally
    Free;
  end;
end;

procedure TfrmClienteMain.FormCreate(Sender: TObject);
begin
  PrevLockState := LockWorkstationState;
  DisableLockWorkstation(True);
  ...
end;

...

procedure TfrmClienteMain.FormDestroy(Sender: TObject);
begin
  DisableLockWorkstation(PrevLockState);
  ...
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 31-12-2013
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 19
look Va camino a la fama
Cita:
Empezado por ecfisa Ver Mensaje
Hola look.

Tal vez te sirva impedir el bloqueo durante la duración de tu programa 'cliente' y restaurar la condición al finalizar, algo como:


Saludos
Hola amigo, ya habia pensado algo como eso, de esa manera funciona bien, en mi caso lo que quiero monitorear es un servidor, el la aplicacion permite embeber a otra para que otros usuarios no tengan acceso total al servidor utilizando la aplicacion cliente, todo funciona de maravilla, pero el problema es que al bloquear la session el servidor ya deja de funcionar la captura solamente, si me conecto por remotdestktop al servidor y cierro la ventana del del remot desktop el servidor se queda con la ventana del login, es por eso que se me ocurrio si hay alguna manera de capturar la imagen de una ventana en particular aunque la session de windows este en modo lock y la aplicacion este corriendo en el background la aplicacion cliente se comunica bien con el servidor aunque este en modo lock pero no obtengo la captura.
__________________
all your base are belong to us
Responder Con Cita
  #4  
Antiguo 02-01-2014
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 19
look Va camino a la fama
hola, parece complicado no, se me ocurre que tel vez si la misma aplicacion pudiera iniciar session en windows cuando el cliente se conecte esto permitiria que trabajara bien, ¿ sera posible esto?, ¿iniciar session desde mi aplicacion en windows sabiendo el usuario y clave?
__________________
all your base are belong to us
Responder Con Cita
  #5  
Antiguo 02-01-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cuando una sesión es bloqueada, el sistema cambia de escritorio por lo que es imposible interactuar desde una aplicación que corre como otro usuario que no sea system. En WinXp si tu App corre como system puede cambiar al nuevo escritorio y capturar la pantalla de bloqueo. Si estás simulando entradas de teclado y ratón puedes iniciar o desbloquear la sesión en cuestión.

Saludos.
Responder Con Cita
  #6  
Antiguo 03-01-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Para documentar con código lo que expuse anteriormente propongo una función para apropiarse del escritorio que usa el sistema por defecto en un momento dado:

Código Delphi [-]
const WINSTA_ALL_ACCESS = $37F;
procedure SetDefaultWSDesktop;
var
  hWSTA: HWINSTA;
  hDSK: HDESK;
begin
  // Me asigno la estación de ventana y el escritorio por defecto
  hWSTA:= OpenWindowStation('winsta0', true, WINSTA_ALL_ACCESS);
  if hWSTA<>0 then
    if SetProcessWindowStation(hWSTA) then CloseWindowStation(hWSTA);

  hDSK:= OpenInputDesktop(0, true, GENERIC_ALL);
    if hDSK <> 0  then
      if SetThreadDesktop(hDSK) then CloseDesktop(hDSK);
end;

A la hora de capturar conviene antes repetir la secuencia:
Código Delphi [-]
var
  hDSK: HDESK;
begin
  hDSK:= OpenInputDesktop(0, true, GENERIC_ALL);
    if hDSK <> 0  then
      if SetThreadDesktop(hDSK) then CloseDesktop(hDSK);
......

Tu aplicación residente en el PC remoto deberá ser un servicio, como forma más fácil de correr como SYSTEM, pero con la dificultad de acceder al GUI. También podrá ser una simple App que se lance desde un servicio, por lo que será SYSTEM también.

Para completar, conviene revisar los siguientes enlaces Lanzar una aplicación GUI desde un servicio y MiniSystem, una miniaplicación para ejecutar programas con privilegios SYSTEM, que te aclararan conceptos y te darán pautas para realizar lo que pretendes.


Saludos.
Responder Con Cita
  #7  
Antiguo 03-01-2014
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 19
look Va camino a la fama
Cita:
Empezado por escafandra Ver Mensaje
Para documentar con código lo que expuse anteriormente propongo una función para apropiarse del escritorio que usa el sistema por defecto en un momento dado:
Gracias amigo, voy a investigar sobre lo que mencionas.

Saludos!
__________________
all your base are belong to us
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
Capturar imagen de ventana pablo Gráficos 7 23-02-2017 10:04:42
Realizar acciones con la ventana del programa inactiva Furyxe Varios 6 24-01-2012 22:08:01
Capturar pantalla de una ventana ? THACKER Varios 3 15-12-2009 18:34:27
Capturar imagen de una ventana (que no es la activa) Neftali [Germán.Estévez] Gráficos 11 29-12-2006 12:03:42
Dejar una ventana en segundo plano inactiva vhirginia Varios 7 22-04-2004 13:46:43


La franja horaria es GMT +2. Ahora son las 22:12:39.


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