Запуск Acrobat Reader 10.0 из C#: как свернуть?

Я запускаю Reader 10.0 для отправки файла PDF на принтер из программы C # в системе Win 7. Вот что я делаю сейчас:

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

Я заметил, что запуск Reader таким образом (или из командной строки) фактически запускает 2 исполняемых файла AcroRd32.exe. Ни один из них не минимизирован. Я также пробовал ProcessWindowStyle.Hidden с тем же результатом.

Есть ли способ заставить Reader запускаться в свернутом виде?

Спасибо!


person I Z    schedule 08.03.2012    source источник
comment
Не могли бы вы опубликовать более полный образец (например, как вы вызываете эту функцию и отсюда), потому что я недавно сделал то же самое на Win 7, и у меня был запущен только 1 экземпляр.   -  person Alex    schedule 09.03.2012


Ответы (4)


После запуска процесса вы можете получить его MainWindowHandle и использовать P/Invoke. чтобы свести к минимуму:

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

//..
ShowWindow(process.MainWindowHandle, 11);  //11 is ForceMinimized
person Steve Danner    schedule 08.03.2012
comment
Зачем вам использовать Win32 API, когда есть встроенная функция Adobe, чтобы запустить его в свернутом виде :)? - person Alex; 08.03.2012
comment
@ Алекс, если он когда-нибудь захочет, чтобы это было более общим, API Win32 - это то, что нужно. Конечно, этот параметр будет работать для Adobe, но что, если ему нужно, чтобы он работал с FoxIt или каким-то другим приложением? - person Steve Danner; 08.03.2012
comment
@Steve, я пробовал, но это, похоже, не влияет на окно Reader, т.е. после вызова ShowWindow окно все еще не свернуто - person I Z; 08.03.2012
comment
Возможно, вы захотите попробовать один из других параметров nCmdShow в ссылке pInvoke. Вы можете попробовать 2 (ShowMinimized) или 0 (Hide). - person Steve Danner; 08.03.2012
comment
К сожалению, тот же результат. :( Вероятно, это как-то связано с тем, что Acrobat каким-то образом запускает два процесса AcroRd32 при запуске процесса. - person I Z; 09.03.2012
comment
Это странно. Похоже на то, как веб-браузеры обрабатывают несколько вкладок. Возможно, попробуйте выполнить итерацию по всем дочерним процессам и вызвать для них одни и те же методы win32. - person Steve Danner; 09.03.2012

Попробуйте включить /h в командную строку. Это запускает экземпляр Adobe Reader, свернутый на панель задач. Однако нет «хорошего» варианта, чтобы полностью скрыть это (насколько мне известно). Помимо взлома некоторых непредсказуемых вещей с помощью Win32 API. Более общий подход к запуску приложения в свернутом виде — через API. Смотрите пост Стива.

Это должно сделать:

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

На самом деле вы не можете отправить документ в формате PDF непосредственно на принтер с помощью Adobe Acrobat Reader, используя код, который вы упомянули.

Что вам нужно, так это API-интерфейс .net pdf, в котором реализована функциональность для печати pdf. вы можете добавить ссылку на проект, а затем начать использовать API. вы можете поискать в Интернете информацию о таких API, которые также бесплатны и просты в использовании.

person Uday0119    schedule 08.03.2012
comment
Я делаю это достаточно успешно. Единственная проблема — раздражающее всплывающее окно Reader, которое я пытаюсь свернуть. - person I Z; 08.03.2012
comment
Хорошо, поскольку AcroRd32.exe продолжает работать после завершения печати, вы можете использовать класс Process для получения запущенных процессов по имени AcroRd32.exe с помощью Process.GetProcessesByName(AcroRd32.exe) и убить их, вызвав метод Kill экземпляра класса Process. Помните, что метод Process.GetProcessesByName дает вам массив экземпляров Process, поэтому вам нужно зациклиться и убить процесс, вызвав метод Kill. - person Uday0119; 08.03.2012
comment
Я тоже это делаю уже. Я просто пытаюсь избежать всплывающего окна при запуске процесса - person I Z; 08.03.2012
comment
Хорошо, но я рекомендую вам использовать pdf .net API для использования, так как они более удобны в использовании, чем использование Adobe Reader. Некоторые API даже не требуют, чтобы на вашем компьютере была установлена ​​программа Adobe Reader, и они тоже работают быстро... - person Uday0119; 08.03.2012
comment
UDAY, вы имеете в виду конкретный API, исходный код которого также доступен? - person I Z; 09.03.2012
comment
Ну, у меня нет большого опыта работы с библиотекой PDF с использованием .net, но некоторые популярные библиотеки - это iText, PDFLib... и т. д., вы можете получить список здесь также... - person Uday0119; 10.03.2012

См. это: http://www.robvanderwoude.com/commandlineswitches.php#Acrobat.

Откройте PDF-файл:

AcroRd32.exe PdfFile

Откройте файл PDF в новом экземпляре Adobe Reader:

AcroRd32.exe /N PdfFile

Откройте файл PDF на странице 7:

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

Откройте файл PDF с активной панелью навигации, уменьшите масштаб до 50%, найдите и выделите слово «партия»:

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

Распечатайте файл PDF с диалоговым окном:

AcroRd32.exe /P PdfFile

Печать файла PDF в автоматическом режиме:

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

Последняя команда откроет новое окно Adobe Reader, распечатает PDF-файл, а затем закроет его окно, если это окно не окажется единственным оставшимся окном Adobe Reader: по крайней мере одно окно Adobe Reader останется открытым.

Изменить: http://partners.adobe.com/public/developer/en/acrobat/PDFOpenParameters.pdf#page=5

person Zelter Ady    schedule 08.03.2012