2012-03-08 42 views
5

Voy a lanzar Reader 10.0 para enviar un archivo PDF a una impresora desde un programa C# en un sistema Win 7. Esto es lo que estoy haciendo ahora:Lanzamiento de Acrobat Reader 10.0 desde C#: cómo minimizarlo?

startInfo.FileName = adobeReaderPath; 
string args = String.Format("/t \"{0}\" \"{1}\"", this.pdfFileName, this.printerName); 
startInfo.Arguments = args; 
startInfo.CreateNoWindow = true; 
startInfo.ErrorDialog = false; 
startInfo.UseShellExecute = false; 
startInfo.WindowStyle = ProcessWindowStyle.Minimized; 
Process process = Process.Start(startInfo); 

me di cuenta de que el lanzamiento del lector como éste (o de aviso de comando) en realidad comienza 2 ejecutables AcroRd32.exe. Ninguno de ellos está minimizado. También probé ProcessWindowStyle.Hidden con el mismo resultado.

¿Hay alguna forma de obligar a Reader a comenzar a minimizar?

Gracias!

+0

Podría publicar una muestra más completa (Como cómo se llama a esta función y desde aquí) Porque recientemente hice lo mismo en Win 7 y solo había 1 instancia ejecutándose. – Alex

Respuesta

2

Pruébalo con /h inclduding en su línea de comando. Esto inicia una instancia de Adobe Reader minimizada en la barra de tareas. Sin embargo, no existe una opción "buena" para ocultarlo completamente (que yo sepa). Aparte de hackear algunas cosas impredecibles con el Win32 API. El enfoque más genérico para iniciar algunas aplicaciones minimizadas es sobre la API. Ver la publicación de Steve.

Esto debería hacer:

string args = String.Format("/h /t \"{0}\" \"{1}\"", this.pdfFileName, this.printerName); 
+0

Lo intenté antes - no funcionó –

2

Después de iniciar el proceso, se puede obtener el MainWindowHandle de la misma y utilizar P/Invoke minimizarlo:

[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

//.. 
ShowWindow(process.MainWindowHandle, 11); //11 is ForceMinimized 
+1

¿Por qué usaría la API Win32 cuando hay una función incorporada de Adobe para iniciarla minimizada :)? – Alex

+0

@Alex, si alguna vez quiere que esto sea más genérico, la API de Win32 es el camino a seguir. Ciertamente, el parámetro funcionará para Adobe, pero ¿qué sucede si necesita que funcione con FoxIt o alguna otra aplicación? –

+0

Sin duda iría con la solución Win Api en lugar de los params ... – squelos

0

ver esto: http://www.robvanderwoude.com/commandlineswitches.php#Acrobat

Abra un archivo PDF:

AcroRd32.exe PdfFile 

Abrir un archivo PDF en una nueva instancia de Adobe Reader:

AcroRd32.exe /N PdfFile 

abrir un archivo PDF en la página 7:

AcroRd32.exe /A "page=7=OpenActions" PdfFile 

Abrir un archivo PDF con el panel de exploración activa, Zoom hacia fuera a 50%, y buscar y resaltar la palabra "lote":

AcroRd32.exe /A "zoom=50&navpanes=1=OpenActions&search=batch" PdfFile 

Imprimir un fil PDF e con diálogo:

AcroRd32.exe /P PdfFile 

imprimir un archivo PDF en silencio:

AcroRd32.exe /N /T PdfFile PrinterName [ PrinterDriver [ PrinterPort ] ] 

El último comando se abrirá una nueva ventana de Adobe Reader, imprimir el archivo PDF y luego terminar su ventana a menos que la ventana pasa a ser la única ventana de Adobe Reader que queda: al menos una ventana de Adobe Reader se dejará abierta.

Editar: http://partners.adobe.com/public/developer/en/acrobat/PDFOpenParameters.pdf#page=5

0

En realidad no se puede enviar un documento PDF directamente a la impresora utilizando Adobe Acrobat Reader usando el código que has mencionado.

Lo que necesitas es a.net pdf api que tiene la funcionalidad implementada para imprimir pdf. puede agregar una referencia al proyecto y luego comenzar a usar la API. Puede buscar en Google/Bing en Internet sobre las aplicaciones de los teléfonos, que también son gratuitas y fáciles de usar.

+0

Lo estoy haciendo con bastante éxito. El único problema es la molesta ventana del Reader que aparece y que estoy tratando de minimizar. –

+0

Ok, Dado que AcroRd32.exe sigue funcionando después de la impresión Además, puede usar la clase Process para obtener procesos en ejecución por nombre de AcroRd32.exe usando Process.GetProcessesByName ("AcroRd32.exe") y eliminarlos llamando al método Kill de la instancia de la clase Process. Recuerde que el método Process.GetProcessesByName le proporciona una matriz de las instancias del proceso, por lo que necesita pasar el proceso y cerrarlo llamando al método Kill – Uday0119

+0

que estoy haciendo esto ya también Solo trato de evitar la ventana emergente cuando se inicia el proceso –

0
Process proc = new Process(); 
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
proc.StartInfo.Verb = "print"; 

proc.StartInfo.FileName = @"Path of Adobe exe"; 
proc.StartInfo.Arguments = String.Format(@"/p /h {0}", fileToPrint); 
proc.StartInfo.UseShellExecute = false; 
proc.StartInfo.CreateNoWindow = true; 
proc.Start(); 
Cuestiones relacionadas