PDA

Ver la Versión Completa : ShellExecute y cerrar Acrobat


jmlifi
05-09-2008, 16:01:58
Hola,
ejecuto lo siguiente:
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
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.

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 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