Delphi - ayuda con ShellExecute

 
Vista:

ayuda con ShellExecute

Publicado por Seba (11 intervenciones) el 03/03/2006 00:50:16
Tengo un archivo de ayuda con formato chm y lo abro desde un boton (o con F1) con el siguiente codigo:
ShellExecute(Handle, 'open', 'ruta\Ayuda.chm',nil ,nil, SW_SHOW);

El problema es que si apreto muchas veces el boton o presiono muchas veces F1, la ayuda se abre muchas veces. Quiero tratar de que si ya se esta ejecutando la ayuda me la muestre y no cree otra ayuda, algo parecido a lo que hago con los forms: manejar una sola instancia de esa ayuda. Con los forms hago asi:

if not Assigned(FListaSocio) then
Application.CreateForm(TFListaSocio, FListaSocio);
FListaSocio.Show

Hay algo en la ShellApi que me pueda ayudar ? o de que otra forma lo puedo hacer ?

Muchas Gracias,

Seba.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:ayuda con ShellExecute

Publicado por Dr Juzam (821 intervenciones) el 03/03/2006 16:39:36
Creo que el siguiente código te podrá ayduar:

var
Ayuda: Integer;
begin
Ayuda:=FindWindow (nil, 'Nombre de la Ventana de Ayuda');
if Ayuda=0 then
ShellExecute(Handle, 'open', 'C:\Manual.chm',nil ,nil, SW_SHOW);
end;

En nombre de la ventana de ayuda debe ser el que aparezca en la barra de la ventana, por ejemplo 'Manual del Programa'.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ayuda con ShellExecute

Publicado por Seba (11 intervenciones) el 03/03/2006 16:47:09
Muchas Gracias !! Era lo que buscaba !! Funciono perfecto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ayuda con ShellExecute

Publicado por Dr Juzam (821 intervenciones) el 03/03/2006 17:06:11
Más por el mismo precio :-)

Para restaurar la ventana de ayuda si está minimizada:

var
Ayuda: Integer;
begin
Ayuda:=FindWindow (nil, 'Nombre de la Ventana de Ayuda');
if Ayuda=0 then
ShellExecute(Handle, 'open', 'C:\Manual.chm',nil ,nil, SW_SHOW)
else
ShowWindow (Ayuda, SW_RESTORE);
end;

Consulta la ayuda para ShowWindow para ver como puedes jugar con la ventana. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mas Completo !!! Ahora si

Publicado por seba (11 intervenciones) el 04/03/2006 02:45:20
Juzam, realmente me sirvio de mucho lo tuyo, investigue un poco mas (google) y pude hacer que si la ayuda esta en segundo plano (no minimizada) se venga al primer plano cuando oprimo el boton. Es complicado pero sirve !! Gracias !!!

procedure TForm1.Button1Click(Sender: TObject);
var
FgThreadId : DWORD; { Hilo de la app. que tenga el foco }
AppThreadId : DWORD; { Hilo de nuestra aplicación }
Ayuda: Integer;
begin
Ayuda:= FindWindow(nil,'Mi Ayuda'); {titulo de la ventana de Ayuda}
if Ayuda=0 then
ShellExecute(Handle, 'open','C:\Ayuda.chm',nil ,nil, SW_SHOW)
else { Si está minimizada basta restaurarla }
if IsIconic(Ayuda) then
ShowWindow(Ayuda, SW_RESTORE)
else
begin
{ Obtener los hilos }
FgThreadId := GetWindowThreadProcessId(GetForegroundWindow, nil);
AppThreadId := GetWindowThreadProcessId(Ayuda, nil);

{ Anexar el hilo de nuestra app. al de la que tenga el foco }
AttachThreadInput(AppThreadId, FgThreadId, true);

{ Ahora sí, activar la applicación }
SetForegroundWindow(Ayuda);

{ Separar el hilo de nuestra app de la otra }
AttachThreadInput(AppThreadId, FgThreadId, false);
end;
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Mas Completo !!! Ahora si

Publicado por Dr Juzam (821 intervenciones) el 04/03/2006 14:09:14
¡OK, me lo apunto!. Otro modo de hacerlo sería así. A ver si te funciona (nos quita de en medio un poco de código):

procedure TForm1.Button1Click(Sender: TObject);
var
Ayuda: Integer;
begin
Ayuda:= FindWindow(nil,'Ayuda.chm'); {titulo de la ventana de Ayuda}
if Ayuda=0 then
ShellExecute(Handle, 'open','C:\Manual.chm',nil ,nil, SW_SHOW)
else { Si está minimizada basta restaurarla }
if IsIconic(Ayuda) then
ShowWindow(Ayuda, SW_RESTORE)
else
SetForegroundWindow (Ayuda);
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar