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

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-10-2019
MaxiDucoli MaxiDucoli is offline
Miembro
 
Registrado: feb 2006
Posts: 134
Poder: 19
MaxiDucoli Va por buen camino
Question Enviar "parámetro" a una aplicación ya abierta.

Hola, buenas noches.
Estoy tratando de hacer algo muy difícil para mi entender de Delphi.
Lo que pretendo hacer es una aplicación tipo "mensajeador" que iría buscando los HANDLE de ventanas externas y mediante PostMessage (Lo hago así por que de otra manera no sé hacerlo) enviarle o eventos de teclado o bien cerrar las ventanas o traerlas al frente.

Mi problemas por ahora es que en un evento no me envía o no lo envío yo bien a un evento de la tecla espacio a un programa previamente abierto con mi aplicación.
Les paso a explicar a ver si me entienden:

Abro mi aplicación, esta lanza un programa externo de linea de comandos (FFPLAY.EXE) y ejecuta un video, cuando el video se cierra o lo cierro presionando una tecla, inmediatamente arranca otro programa externo que quedaría "de fondo" pasando música (Fmedia.exe) y además lanza un programa más que queda como pantalla principal (EmulationStation).

Hasta ahí todo bien. Esta aplicación se que de fondo esperando que se le envíen mensajes con otra aplicación que se ejecutaría cuando el usuario lo requiera, que le envía un código + una linea de comandos que se vería así:

EMUamiga||"D:\RetroLife\emulators\amiga\launcher.exe -config:floppy-drive-count=1 "d:\RetroLife\roms\amiga\GalaxyBlast_v1.1.zip"||

Hasta ahí todo va bien, funciona a la perfección.
El problema viene ahora.

Ese código de arriba lo proceso con una aplicación también mia llamada RELExecutor.exe que le envía los mensajes a la primer aplicación hasta no necestar más de RELExecutor.exe, y cerrarlo.

Yo necesito enviar a la aplicación Fmedia.exe un evento de teclado que sería la barra espaciadora presionada, para que este quede en PAUSA, con la línea de comandos de allá arriba (sin el EMUamiga y los ||) ejecuto el emulador de CommodoreAmiga y una vez que se me cierre el emulador, volver a enviar la barra espaciadora para quitar la PAUSA,

Bueno, todo este proceso de poner la PAUSA, cerrar el RLExecutor.exe y quitar la PAUSA no me funciona en este código que les voy a poner por acá.

Alguien podría darle una mirada y decirme qué puedo agregarle o por qué no me funciona, por favor?

Muchas gracias!!!!!

Código Delphi [-]
unit RetroLauncher;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, MisFunciones, jpeg, Vcl.ExtCtrls,
  JvExExtCtrls, JvImage, shellapi, MMSYSTEM, Vcl.MPlayer,strutils, JvBackgrounds;

type
  TFrmLauncher = class(TForm)
    Timer1: TTimer;
    Splash: TJvBackground;
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
    procedure LoadIMG (Splash : TJvBackGround;Ruta:String);
  private
    { Private declarations }
  public
    { Public declarations }

  end;




var
  FrmLauncher: TFrmLauncher;
  contador, contador2 : integer;
  LAUNCHERPATH : String;
  HWindow : HWND;



implementation

{$R *.dfm}

procedure TFrmLauncher.LoadIMG (Splash : TJvBackGround;Ruta:String);
begin
 Splash.Image.Picture.LoadFromFile(ruta); // Carga una imagen que se le envía mediante los mensajes de RELExecutor.exe
end;

procedure TFrmLauncher.FormClose(Sender: TObject; var Action: TCloseAction);
var
H, J : HWND;
begin

//AL CERRAR LA APLICACION, CERRAMOS FMEDIA Y RELEXECUTOR SI ES QUE SE ESTAN EJECUTANDO.

H := FindWindowExtd('fmedia.exe');
J := FindWindowExtd('RLExecutor');

if IsWindow(H) then
begin
PostMessage(H, WM_CLOSE, 0, 0);
end;

if IsWindow(J) then
begin
PostMessage(J, WM_CLOSE, 0, 0);
end;


end;

procedure TFrmLauncher.FormCreate(Sender: TObject);
var
Fondo : TPicture;
begin
FrmLauncher.Width := Screen.Width;
FrmLauncher.Height := Screen.Height;
contador := 0;
contador2 := 0;
Timer1.Enabled := true;
end;

procedure TFrmLauncher.FormDestroy(Sender: TObject);
var
H : HWND;
begin

H := FindWindowExtd('fmedia.exe');

if IsWindow(H) then
begin
PostMessage(H, WM_CLOSE, 0, 0);
end;


end;

procedure TFrmLauncher.FormResize(Sender: TObject);

begin
LAUNCHERPATH := ExtractFilePath(Application.ExeName);
Splash.Image.Picture.LoadFromFile(LauncherPath + '\Launcher\RLLogo.jpg' ) // CARGAMOS IMAGEN DESDE RELEXECUTOR.EXE
end;

procedure TFrmLauncher.FormShow(Sender: TObject);
begin
//MUSICPATH := ExtractFilePath(Application.ExeName) + '\music\';
end;

procedure TFrmLauncher.Timer1Timer(Sender: TObject);
var
i : integer;
Lista : TStringList;
Ruta,ffplay,Fmedia : String;
begin
Ruta := ExtractFilePath(Application.ExeName) + 'music\';
ffplay := '"' +LAUNCHERPATH + 'Launcher\ffplay.exe' + '"';
Inc(Contador);
if contador = 5 then
begin
Lista := TStringList.Create;

FindFiles(Ruta,'*.*',false,Lista);
// EJECUTAMOS EL VIDEO Y ESPERAMOS A QUE TERMINE EL PROCESO PARA PODER CONTINUAR.
  if EjecutarYEsperar (LAUNCHERPATH + 'Launcher\ffplay.exe -fs -autoexit -exitonkeydown -exitonmousedown -infbuf ' +
  '"' + LAUNCHERPATH + '\intro\intro.mp4"',SW_HIDE)= 0 then
  begin
  //  Timer1.Enabled := False;
  //Timer1.Enabled := True;
  Randomize;
  i := Random(Lista.Count - 1 );
  Ruta := LAUNCHERPATH + 'Launcher\playlist.m3u';
  Fmedia := ExtractFilePath(Application.ExeName) + 'tools\fmedia\fmedia.exe';
  Lista.SaveToFile(Ruta);

  //Ruta :='"' + Lista[i] + '"';

  lista.Free;


// COMO YA TERMINO EL VIDEO EJECUTAMOS EL PROGRAMA PARA QUE QUEDE DE FONDO TOCANDO MUSICA.

  ShellExecute(0,nil, PWideChar(Fmedia),
  PWideChar(' --random "' + Ruta + '"' ),PWIDECHAR(ExtractFilePAth(Fmedia)),SW_MINIMIZE);


// EJECUTAMOS EL PROGRAMA PRINCIPAL Y ESPERAMOS A QUE TERMINE.
  if EjecutarYEsperar (LAUNCHERPATH + '\RLLauncher.bat',SW_NORMAL) = 0 then
  begin
//  Timer1.Enabled := False;
  FrmLauncher.Close;
  //keybd_event(VK_SPACE,0,0,0);
//  CloseWindow(H);
  end;
        End else
        Begin
        ShowMessage('RetroLife: - No RLLauncher.bat present');
      End;
//keybd_event(
end;
//H := FindWindowByName(
end;





// PROCEDIMIENTO QUE RECIBE LOS MENSAJES DE LA OTRA APLICACION (RLEXECUTOR.EXE)
procedure TFrmLauncher.WMCopyData(var Msg: TWMCopyData);
var
MESSG,LoadIMGs,CMDLN,EMULATOR : String;
WindowLauncher,WindowExecutor, WindowFrontEnd : HWND;
TerminarVuelta : integer;
CONST RUTA = '/RetroLife\LaunchIMGS\';
begin
TerminarVuelta := 1;
MESSG := '';
  MESSG := PChar(Msg.CopyDataStruct.lpData); // MENSAJE RECIBIDO
  Msg.Result := 1; //Valor de respuesta para indicar que se ha
                  //recibido correctamente la información
//  ShowMessage(MESSG);
//  MessageDlg ('Mensaje recibido correctamente de aplicación externa.',
//      mtInformation, [mbok], 0);
LoadIMGs := ExtractTextBetween(MESSG,'|','|'); // CARGAMOS UNA IMAGEN COMO FONDO DE LA APLICACION.

//if AnsiContainsText(MESSG,'LineaDeComando') then CMDLN := ExtractTextBetween(MESSG,'||','||');

if AnsiContainsText(MESSG,'CONSOLA') then
begin
  LoadIMG(Splash,RUTA + LowerCase(LoadIMGs) + '.jpg'); //CARGAMOS LA IMAGEN
end;


//ACA VIENE EL CODIGO QUE NO ME ESTARIA FUNCIOANADO.
      if AnsiContainsText(MESSG,'EMUamiga') then
       begin
//             MensajeFMedia('fmedia.exe');
              CMDLN := ExtractTextBetween(MESSG,'||','||');

              if EjecutarYPrimerPlano(CMDLN,SW_NORMAL,'FS-UAE') = 0 then // EJECUTAMOS EL PROGAMA Y ESPERAMOS A QUE TERMINE
              begin

              //MensajeFMedia('fmedia.exe');


//COMO EL PROGRAMA QUE EJECUTAMOS TIENE UN LAUNCHER, ESTE SE CIERRA Y NO QUEDA DE FONDO, SI NO QUE LANZA OTRO PROGRAMA QUE VA A SER BUSCADO EN EL REPEAT HASTA QUE LO CERREMOS.

                    Repeat
                    WindowLauncher := FindWindowExtd('FS-UAE'); // BUSCO EL PROGRAMA QUE ABRIO EL LAUNCHER
                        If WindowLauncher = 0 then // SI EL PROGRAMA SE CERRO HAGO LOS PASOS ARRIBA EXPLICADOS
                        begin
                        LoadIMG(Splash,LauncherPath + '\Launcher\RLLogo.jpg');
                        TerminarVuelta := 0;
                        WindowExecutor := FindWindowExtd('RLExecutor'); // BUSCO RLEXECUTOR
                            if IsWindow(WindowExecutor) then
                              begin
                              PostMessage(WindowExecutor,WM_CLOSE,0,0); // SI LO ENCUENTRO LO CIERRO PERO NO CIERRA
                              MensajeFmedia('fmedia.exe');  // CON ESTE PROCEDIMIENTO BUSCO EL FMEDIA y SI ESTA ABIERTO LE ENVIO PAUSA, PERO NO ME FUNCIONA
                            end;
                        end;
                    Until TerminarVuelta = 0; // COMO EL EMULADOR SE CERRO, TERMINO EL LOOP DE REPEAT.
              end;
//              MensajeFMedia('fmedia.exe'); // QUITO LA PAUSA (NO FUNCIONA)

              Repeat
                WindowFrontEnd := FindWindowExtd('EmulationStation'); / BUSCO LA VENTANA DEL PROGRAMA PRINCIPAL POR QUE AL EJECUTAR EL EMULADOR SE "ESCONDE" Y NO APARECE ENTRE LAS VENTANAS ABIERTAS
              until WindowFrontEnd <> 0; // ENCUENTRO EL PROGRAMA Y CAPTURO SU HANDLE.

              if isWindow(WindowFrontEnd) then 
              begin
              SetWindowPos(WindowFrontEnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);  // ENVIO EL PROGRAMA AL PRIMER PLANO.
              end;


       end;

// OTRO MENSAJE PARA HACER OTRA COSA QUE SI ANDA.
    if MESSG = 'Normal' then
    begin
    FrmLauncher.FormStyle := FsNormal;
    end;

end; // FIN


end.


Bueno, ojalá lo hayan entendido y puedan ayudarme.

SALUDOS!!!!!
Responder Con Cita
 



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
Usar TServerSocket y TClientSocket para enviar "streams" más o menos "grandes" dec Internet 9 04-08-2015 16:11:50
"Bug" de automatización COM al usar WideChar como parámetro Al González [GH Freebrary] 3 09-01-2014 18:21:46
Error delphi "valor no puede ser nulo nombre del parametro key" nickolas Varios 0 21-08-2012 02:07:45
funcion con parametro "raro" emeceuy Varios 3 26-11-2008 13:41:46
Cómo insertar "NULL" en un parametro de INSERT en SQL Joselito SQL 4 23-10-2005 00:17:35


La franja horaria es GMT +2. Ahora son las 15:34:13.


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