Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   ShellExecute y cerrar Acrobat (https://www.clubdelphi.com/foros/showthread.php?t=59718)

jmlifi 05-09-2008 16:01:58

ShellExecute y cerrar Acrobat
 
Hola,
ejecuto lo siguiente:
Código Delphi [-]
ShellExecute(Self.Handle, 'print', PChar(Path+'\'+PiezaenRed(PzpedidosREF_N.AsString)+'.pdf'),  nil, nil, 0);

después se queda el Acrobat abierto. ¿cómo lo puedo cerrar ?

felipe88 05-09-2008 21:33:34

Código Delphi [-]
var
  h: HWND;
begin
  h := FindWindow(nil, 'Acrobat Reader'); // O el titulo de la aplicación
  if h <> 0 then PostMessage(h, WM_CLOSE, 0, 0);
end;
Verifica que ese sea el titulo :)

cHackAll 05-09-2008 22:23:59

Considero más apropiado usar la API ShellExecuteEx especificando SEE_MASK_NOCLOSEPROCESS en su estructura para obtener en la misma el manejador (hProcess), del proceso creado... ésto obviamente para que mediante la API WaitForSingleObject podamos saber si el proceso creado está en ejecución.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var ShellExecuteInfo: TShellExecuteInfo;
begin
 with ShellExecuteInfo do
  begin
   cbSize := SizeOf(ShellExecuteInfo);
   fMask := SEE_MASK_NOCLOSEPROCESS;
   Wnd := Handle;
   lpVerb := 'open';
   lpFile := PChar(Path + '\' + PiezaenRed(PzpedidosREF_N.AsString) + '.pdf');
   lpParameters := nil;
   lpDirectory := nil;
   nShow := SW_HIDE;
  end;
 ShellExecuteEx(@ShellExecuteInfo);
 WaitForSingleObject(ShellExecuteInfo.hProcess, INFINITE);
 MessageBox(0, 'Done!', nil, 0);
end;

Saludos

felipe88 05-09-2008 22:28:00

Buen aporte maestro ;)... y pensar que yo solo encontre el truco :o

bbjb 27-01-2009 12:06:01

Disculpad mi ignorancia, pero me he encontrado el mismo problema que jmlifi y he intentado seguir vuestro consejo pero hay algo que no entiendo.
Sustituyo la acción 'open' por 'print' ya que necesito imprimir el documento, creo que es correcto no?.

Una vez llegado al punto
Código:

WaitForSingleObject(ShellExecuteInfo.hProcess, INFINITE);
el programa queda parado hasta que cierre yo la ventana de adobe reader que ha utilizado para imprimir el documento.
Si lo que necesito es que una vez impreso cierre automaticamente la aplicación adobe reader, ¿qué paso estoy realizando mal?.

Un saludo

cHackAll 30-01-2009 02:59:31

Hola bbjb, me parece que puedes llamar a WaitForSingleObject con un tiempo razonable (en lugar de INFINITE) y luego cerrarla con TerminateProcess


La franja horaria es GMT +2. Ahora son las 11:36:22.

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