- PR -

(C#)AcrobatReaderを使って印刷した結果が成功か失敗かを取得したい

投稿者投稿内容
EarlyHero
常連さん
会議室デビュー日: 2007/03/16
投稿数: 37
お住まい・勤務地: 福岡県
投稿日時: 2007-03-16 10:24
はじめまして。EarlyHeroです。

現在、C#でAcrobatReaderを呼び出して印刷をしているのですが、
その印刷が成功したか失敗したかの結果が判断できなくて困っています。

ProcessのExitCodeで判断できないかと考えたのですが、プロセスが
起動しているか終了しているかしか判断できませんでした。
(もしかすると、それ以外も判断できるかもしれませんが。)

成功か失敗かを判断するためのいいアイデアはないでしょうか?
失敗した場合、何が原因で失敗したのかを判断できたらなおいいです。

検討段階ですが、現状は以下のようにして印刷をしています。

System.Diagnostics.ProcessStartInfo psi
= new System.Diagnostics.ProcessStartInfo();
//パスを取得する
psi.FileName = @"C:\Program Files\Adobe\Acrobat 7.0\Reader\AcroRd32.exe";
//コマンドラインを指定
psi.Arguments = @"/t /n " + filepath;

// 実行
Process p = System.Diagnostics.Process.Start(psi);

// まだ閉じていない場合
if (!p.HasExited)
{
  // すぐには閉じれないので1秒待つ
  p.WaitForExit(1000);
  // AcrobatReaderを閉じる
  p.CloseMainWindow();
  p.Close();
  p.Dispose();
}

上記のように印刷しています。
psi.Arguments = @"/t /n " + filepath;
についてはファイルパスしか指定していませんので、現状は通常使うプリンタで
印刷しているのですが可能であれば
psi.Arguments = @"/t /n " + filepath + " " + printername + " " + drivername;
に変更して印刷時に何が原因で失敗したかを判断したいと思っています。

みなさんのご意見をお聞かせください。よろしくお願いします。


[ メッセージ編集済み 編集者: EarlyHero 編集日時 2007-03-16 13:51 ]
howfar
会議室デビュー日: 2007/03/16
投稿数: 14
投稿日時: 2007-03-16 17:01
「win32 API」を使えば、こんな機能ができる、難しくないと思う
EarlyHero
常連さん
会議室デビュー日: 2007/03/16
投稿数: 37
お住まい・勤務地: 福岡県
投稿日時: 2007-03-16 17:20
「win32 API」をどのように使うと印刷結果が取得できますか?
例えがあると助かります。

あと、件名にもあるように「Acrobat Reader」(Ver.7.0.8)を使いたいのですが、
「win32 API」でも可能でしょうか?
よろしくお願い致します。

[ メッセージ編集済み 編集者: EarlyHero 編集日時 2007-03-16 17:21 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-03-16 18:46
acrobat のメッセージを監視しろってことかな?


acrobat の sdk が、アドビのページに有ったと思いますが、それには目を通しましたか?

基本的に他のアプリケーションなので、公開されていない情報を採ることは出来ません。盗ることは、出来るかもしれませんが。
_________________
howfar
会議室デビュー日: 2007/03/16
投稿数: 14
投稿日時: 2007-03-16 21:21
[win32 API]では作る流れは下記

1.対応のAcrobat Readerプロセスのdialogのhandleを取って
2.dialogのメッセージを読み取って、メッセージを分析する

関連してるAPIは、「FindWindow」や「GetWindowText」など、
詳しい使い方はMSDNで探して、僕はちょっと忘れたT_T、すみません、
私の日本語はうまくないですから、もし違うところがあったら、ご指導ください^_^
howfar.jp@gmail.com
EarlyHero
常連さん
会議室デビュー日: 2007/03/16
投稿数: 37
お住まい・勤務地: 福岡県
投稿日時: 2007-03-16 22:40
みなさん返信ありがとうございます。
明日妻の誕生日なのでケーキを作っていて遅くなってしまいました。

今手元にはないのですが、「Developer 〜」というPDFには目を通しました。
そこで、コマンドラインを使って印刷ができることが書いてあったので
プログラムで採用しています。drivernameは必要ないんですね(笑)。

ちなみに引用符というと「"」(ダブルクォーテーション)ですか?
調べたんですが、「'」(シングルクォーテーション)かどちらか分かりません。
すみません、知識がなくて。何かのついてでいいので教えてくださいね。
[3/19 追記]
「"」(ダブルクォーテーション)の方ですね。実際に試して分かりました。
囲まないとスペースが含まれている場合にエラーになってしまいます。
ご指摘ありがとうございます。

印刷が終わるまでの時間を1秒にしていたのは、プロセスを起動すると
「AcrobatReader起動→印刷」が行われるのですが、AcrobatReaderは
出来る限り起動させておきたくなかったからです。
「p.CloseMainWindow()」で終了させるのですが、私の環境では1秒あれば
起動→印刷までできたので1秒にしていました。
現状ですが、検討した結果60秒待つことにしています。

「win32 API」ですが、私の知識不足のため詳しくは知らないのですが、
Web等で調べて1.と2.の手順をやってみたいと思います。

AcrobatReaderで印刷が失敗した場合は確かAcrobatReader上で
ダイアログが表示されているのでそれを読み取れるといいですね。
ただ心配なのが、既存で起動していたAcrobatReaderとどうやって
区別したらいいかですね。
違いって分かるんでしょうか?

もしご存知の方がいらっしゃったら教えてください。
よろしくお願いいたします。

[ メッセージ編集済み 編集者: EarlyHero 編集日時 2007-03-19 10:10 ]
howfar
会議室デビュー日: 2007/03/16
投稿数: 14
投稿日時: 2007-03-16 23:04
引用:

EarlyHeroさんの書き込み (2007-03-16 22:40) より:
AcrobatReaderで印刷が失敗した場合は確かAcrobatReader上で
ダイアログが表示されているのでそれを読み取れるといいですね。
ただ心配なのが、既存で起動していたAcrobatReaderとどうやって
区別したらいいかですね。
違いって分かるんでしょうか?



「win32 API」を使う場合は、プロセス毎にhandleが違いですが、codingの際、判断しにくいですけど、AcrobatReaderのプロセスを起動する前に、この監視プロセスを起動したほうがいいと思います
_________________
私は今日本語をべんきょうしていますが、だから日本語がうまくないですから、もし違うところがあったら、ご指導ください^_^
howfar.jp@gmail.com
EarlyHero
常連さん
会議室デビュー日: 2007/03/16
投稿数: 37
お住まい・勤務地: 福岡県
投稿日時: 2007-03-16 23:59
夜遅くに返信いただいてありがとうございます。

Jittaさんやhowfarさんがおっしゃられる監視プロセスというのは
私が現在プログラミングで使っているProcessクラスで監視できるのでしょうか?

監視プロセスを使用することで既に起動しているAcrobatReaderを察知する
ことができるのなら便利ですね。Web検索して調べてみますね。

あとは、印刷する際に既にAcrobatReaderのプロセスが存在する場合、
(プログラムの)2つ目のAcrobatReaderのプロセスを起動しても
1秒ほどで消えてしまうんですよ。不思議ですね。
(もしかすると当然なんでしょうか?)

プロセスを終了させる際に既にプロセスが終了してしまっているかを
チェックするためにHasExitdメソッドを使っているんですが、
false(終了していない)なのにCloseMainWindowメソッドを使用すると
既に終了しているって怒られてしまいます。

これについてご存知の方がいらっしゃったら教えてください。
よろしくお願いします。

もうすぐ妻の誕生日です。

スキルアップ/キャリアアップ(JOB@IT)