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
public
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); end;
procedure TFrmLauncher.FormClose(Sender: TObject; var Action: TCloseAction);
var
H, J : HWND;
begin
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' ) end;
procedure TFrmLauncher.FormShow(Sender: TObject);
begin
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);
if EjecutarYEsperar (LAUNCHERPATH + 'Launcher\ffplay.exe -fs -autoexit -exitonkeydown -exitonmousedown -infbuf ' +
'"' + LAUNCHERPATH + '\intro\intro.mp4"',SW_HIDE)= 0 then
begin
Randomize;
i := Random(Lista.Count - 1 );
Ruta := LAUNCHERPATH + 'Launcher\playlist.m3u';
Fmedia := ExtractFilePath(Application.ExeName) + 'tools\fmedia\fmedia.exe';
Lista.SaveToFile(Ruta);
lista.Free;
ShellExecute(0,nil, PWideChar(Fmedia),
PWideChar(' --random "' + Ruta + '"' ),PWIDECHAR(ExtractFilePAth(Fmedia)),SW_MINIMIZE);
if EjecutarYEsperar (LAUNCHERPATH + '\RLLauncher.bat',SW_NORMAL) = 0 then
begin
FrmLauncher.Close;
end;
End else
Begin
ShowMessage('RetroLife: - No RLLauncher.bat present');
End;
end;
end;
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); Msg.Result := 1; LoadIMGs := ExtractTextBetween(MESSG,'|','|');
if AnsiContainsText(MESSG,'CONSOLA') then
begin
LoadIMG(Splash,RUTA + LowerCase(LoadIMGs) + '.jpg'); end;
if AnsiContainsText(MESSG,'EMUamiga') then
begin
CMDLN := ExtractTextBetween(MESSG,'||','||');
if EjecutarYPrimerPlano(CMDLN,SW_NORMAL,'FS-UAE') = 0 then begin
Repeat
WindowLauncher := FindWindowExtd('FS-UAE'); If WindowLauncher = 0 then begin
LoadIMG(Splash,LauncherPath + '\Launcher\RLLogo.jpg');
TerminarVuelta := 0;
WindowExecutor := FindWindowExtd('RLExecutor'); if IsWindow(WindowExecutor) then
begin
PostMessage(WindowExecutor,WM_CLOSE,0,0); MensajeFmedia('fmedia.exe'); end;
end;
Until TerminarVuelta = 0; end;
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;
if isWindow(WindowFrontEnd) then
begin
SetWindowPos(WindowFrontEnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE); end;
end;
if MESSG = 'Normal' then
begin
FrmLauncher.FormStyle := FsNormal;
end;
end;
end.
Bueno, ojalá lo hayan entendido y puedan ayudarme.
SALUDOS!!!!!