- PR -

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

投稿者投稿内容
EarlyHero
常連さん
会議室デビュー日: 2007/03/16
投稿数: 37
お住まい・勤務地: 福岡県
投稿日時: 2007-03-22 11:21
みなさんご返信ありがとうございます。
そして、Jittaさん、プライベートメッセージで質問してすみませんでした。
好き嫌いは人それぞれなので、Jittaさんが嫌というのであれば、
プライベートメッセージでの質問は今後しません。本当にすみません。

確かにプリンタ自体が異常になっている場合は判断ができないんです。
ファイル名が不正な場合はAcrobatReader起動時にエラーメッセージが
表示されてプロセスが残るので、そこからエラーメッセージを読み取れば原因を
つかめるかと思っていたのですが、プリンタが不正な場合はエラーメッセージを
表示してくれないんですよ。
PDFは表示されるのですが、エラーメッセージが表示されないので、その場合は
プリンタを監視しておけば何らかのエラーがつかめるのではないかと思っていました。
Jittaさんのご意見を読んで確かにプリンタ上での異常を読み取るのは厳しいと
痛感しました。
SDKでプリンタの異常を読み取ることができればいいのですが、AcrobatReaderと
プリンタは別物なので多分そういう機能はないかと思います。
予算を出せるかどうかは、そういう機能があって、なおかつそれを活かすに値する
予算であるかどうかですので、極力SDKなしでやろうと思っていました。

ファイル名やプリンタ名は事前にチェックしているので、そこで全て引っかかって
くれればよいのですが、どうしてもプリンタ上での異常は判断できそうにないです。

みなさんのご意見も考慮して今後どうしていくべきか検討したいと思います。

[ メッセージ編集済み 編集者: EarlyHero 編集日時 2007-03-22 11:24 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-03-22 12:18
引用:

EarlyHeroさんの書き込み (2007-03-22 11:21) より:
ファイル名やプリンタ名は事前にチェックしているので、そこで全て引っかかって
くれればよいのですが、どうしてもプリンタ上での異常は判断できそうにないです。

みなさんのご意見も考慮して今後どうしていくべきか検討したいと思います。


クレジットカードの請求書の印刷など、本当に印刷できたのかを厳密にチェックしたいという需要は確かに存在するし、それが出来るプリンタも無いわけではないんですよ。ただし、それはWindows標準のAIでは実現できず、メーカー依存のAPIを使用する事になるわけです。

極端な例だと印刷した内容をスキャナで取り込んで画像解析してチェックするなんてシステムもあります。ただ本当にそこまでするシステムを一企業で保有しようとするとコスト高になりすぎるわけで、だからこそ請求書の印刷を外部の企業に委託したりするわけです。
EarlyHero
常連さん
会議室デビュー日: 2007/03/16
投稿数: 37
お住まい・勤務地: 福岡県
投稿日時: 2007-03-22 15:52
検討した結果ですが、プリンタで発生するエラーについては考慮しないことにしました。
SDK(価格)のコストや開発面(作成&メンテナンス)のコストを考慮しての結果です。
いろいろご意見をいただいて申し訳ないと思っています。
しかし、この結果がどうあれ、みなさんからご意見をいただいたからこそ
検討ができたので感謝しています。

プリンタ上のエラーは考慮しないことにしたものの、できればAcrobatReader上の
ダイアログに表示されているエラーが取得できれば、取得して表示したいと思っています。
GetDlgItemTextの第2引数のIDの取得方法を調べてみたのですが、結局私の力不足で
見つけることができませんでした。
ちなみにFindWindowで画面のタイトル名を指定してハンドルを取得することはできました。
howfarさんありがとうございます。

もしご存知の方がいらっしゃったらご返信いただくと本当に助かります。
よろしくお願いいたします。

[追記]
未記入さんへ
SetWindowsHookExは使い方がまだわからないので、調べてから実際に使ってみます。
Webで検索したところ、インストールするフックのタイプやフックプロシージャの
アドレスが必要ということでしたので、それも勉強する必要があります。
それでメッセージが取得できればそれでもいいですね。ありがとうございます。

[ メッセージ編集済み 編集者: EarlyHero 編集日時 2007-03-22 16:01 ]
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-03-22 23:31
引用:

Jittaさんの書き込み (2007-03-21 00:29) より:
 ちゃっぴさんの方法で、AdobeReader が残るのは、リリースしていないから。これは、「Excel プロセスが残る」で検索すると、対応方法が見つかります。



これ違うんです。なにしろ VB6.0 で実行しても、新たな Adobe Reader の window が起動しますから。なぜか。。。

あと、WMI で Win32_Printer とか Win32_PrintJob を使って監視させてみたことはありますね。
_________________
EarlyHero
常連さん
会議室デビュー日: 2007/03/16
投稿数: 37
お住まい・勤務地: 福岡県
投稿日時: 2007-03-23 18:39
長文になりますが、GetDlgItemTextとSetWindowsHookExについて調べてみましたので
記載したいと思います。

GetDlgItemTextの第2引数についてですが、やはりGetDlgCtrlIDを使用して
IDを取得するようです。
ただ、GetDlgCtrlIDでIDを取得する際は画面で使用されているコントロールの
ハンドルを指定する必要があるようです。
C#で作成したサンプルコードを記載しておきます。

/// <summary>
/// 指定したコントロールのIDを取得
/// </summary>
/// <param name="hWnd">コントロールのハンドル</param>
/// <returns>指定したコントロールのID</returns>
[DllImport("user32.dll")]
private static extern int GetDlgCtrlID(IntPtr hWnd);

/// <summary>
/// 指定したコントロールに表示されている文字を取得
/// </summary>
/// <param name="hDlg">画面のハンドル</param>
/// <param name="nIDDlgItem">コントロールのID</param>
/// <param name="lpString">文字取得用のオブジェクト</param>
/// <param name="nMaxCount">取得文字数</param>
/// <returns>取得結果</returns>
[DllImport("user32.dll")]
private static extern int GetDlgItemText(IntPtr hDlg, int nIDDlgItem, StringBuilder lpString, int nMaxCount);

private void button1_Click(object sender, System.EventArgs e)
{
  int id = GetDlgCtrlID(this.textBox1.Handle);
  StringBuilder sb = new StringBuilder(100);
  GetDlgItemText(this.Handle, id, sb, sb.Capacity);
  this.label1.Text = sb.ToString();
}

こんな感じだとうまい具合に文字を取得できました。
ここをご利用の皆さんだと分かると思いますが、
button1を押せばtextBox1に書かれている文字がlabel1に表示されます。

AcrobatReaderのダイアログからも取得できたらいいのですが、
GetDlgCtrlIDでIDを取るのができないのでGetDlgItemTextではできませんでした。
実際にIDを取ろうとした方法を記載しておきます。
(pはAcrobatReaderのプロセスです。1ページ目を参考にしてください。)

int id1 = GetDlgCtrlID(p.Handle);
int id2 = GetDlgCtrlID(p.MainWindowHandle);
int id3 = GetDlgCtrlID("FindWindowで取得したハンドル");

上記の3パターンでもIDは取得できませんでした。やはり画面のハンドルを
渡しているだけではできそうにないですね。

AcrobatReaderのハンドルが分かっている状態でGetDlgCtrlIDを巧みに使用して
ダイアログのIDを取得し、GetDlgItemTextで文字を取得する方法をご存知の方が
いらっしゃれば是非教えてください。 よろしくお願いいたします。

SetWindowsHookExについては、「第160章 メッセージフックの基礎」
<http://www.kumei.ne.jp/c_lang/sdk2/sdk_160.htm>
を参考にして調べたのですがdllを作成しておく必要がありそれを使うようです。
今回の作業では独自のdllを追加して使うことはできませんのでこちらの
対応は保留させていただきました。
ちゃっぴさん、アドバイスいただいたのにごめんなさい。

現状、AcrobatReadeのダイアログからメッセージを取得することも困難なので
p.CloseMainWindowを実行してもp.HasExitがfalse(閉じられていない)の場合は
AcrobatReader上でエラーメッセージが表示されている状態なので、
それを基準にエラーになっているかどうかを判断しようかと思います。
もしかすると、その判断基準もあいまいなので保留になるかもしれません。

残念ですが、思うようにうまくいかないものですね。

[ メッセージ編集済み 編集者: EarlyHero 編集日時 2007-03-23 18:46 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-03-29 23:14
引用:

EarlyHeroさんの書き込み (2007-03-22 15:52) より:
SDK(価格)のコストや開発面(作成&メンテナンス)のコストを考慮しての結果です。


 気になっていたのをやっと調べました。SDK って、無償だったように思っていたので。

http://www.adobe.com/devnet/acrobat/
引用:
Acrobat 8 SDK is now available free of charge to all users.



_________________

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