[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/10/05(Thu) 13:25
投稿者名:蒼月
Eメール:
URL :
タイトル:
プリンタの各種監視について
いつもお世話になっています。

現在、私はプリンタによるビットマップの印刷を行っています。
印刷は、すぐにできました。
しかし、紙が無い、セットされている用紙のサイズが違う等の状態になった場合に、その旨を画
面に表示して、解決を促すようにしたいのですが、プリンタの状態を知る方法がわからなくて困っ
ています。
自分で調べたところ、WINAPIの「PRINTER_INFO構造体」を使えばできそうだというところまでは
たどり着いたのですが、ヘルプを見ても英語で構造体の情報として何が含まれているのかがわかり
ません。

お聞きしたいことは、

1.この方法で実現可能かどうか?(実現不可能な場合、他にどのような方法があるのか?)
2.可能であれば、構造体の中身?についてご教授頂きたい

以上の2つです。
私のほうでも引き続き調査を続行しますが、よろしくお願いいたします。

投稿時間:2006/10/06(Fri) 08:49
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: プリンタの各種監視について
> しかし、紙が無い、セットされている用紙のサイズが違う等の状態になった場合に、その旨を画
> 面に表示して、解決を促すようにしたいのですが、プリンタの状態を知る方法がわからなくて困っ
> ています。

少なくても、最近のプリンターならメーカのドライバーやユーティリティで
エラーメッセージが表示されるはずですが?


> 自分で調べたところ、WINAPIの「PRINTER_INFO構造体」を使えばできそうだというところまでは
> たどり着いたのですが、ヘルプを見ても英語で構造体の情報として何が含まれているのかがわかり
> ません。
どこで、どのAPIを使って取得できると書いてあったのでしょうか?
PRINTER_INFO構造体 と言っても色々ありますが? どの構造体のどれの事でしょうか?
使用しているWin32 API は?

プリンタの各種監視 と書いておられますが、各種となると相当難しいし、全ての
メーカの全てのプリンターにとはいかないと思いますよ。

投稿時間:2006/10/06(Fri) 10:42
投稿者名:蒼月
Eメール:
URL :
タイトル:
Re^2: プリンタの各種監視について
花ちゃん さん
ご回答ありがとうございます。

> 少なくても、最近のプリンターならメーカのドライバーやユーティリティで
> エラーメッセージが表示されるはずですが?
今回は、ドライバの仕様がわからない状態であるので、ドライバやユーティリティの無い状態で紙
が無い状態を認知できるかどうかを知りたかったのです。

> どこで、どのAPIを使って取得できると書いてあったのでしょうか?
> PRINTER_INFO構造体 と言っても色々ありますが? どの構造体のどれの事でしょうか?
> 使用しているWin32 API は?
APIを使って取得できるとは、どこにも書いてありませんでした。
自分でそれを使ってできるのではないか?という判断を下しただけです。
但し、実現可能だということを決定付ける事柄が見つかりませんでした。
なので、質問の一つに「実現可能かどうか?」という質問を入れた次第です。

また、どの構造体かとのことですが、全てが英語表記のためどれがどんな意味の構造体なのかがわ
かりませんでしたので指定をしませんでした。
なので、紙無し状態を知ることのできる値が格納されるものがどの構造体なのかを含めて、ご教授
頂きたかったのです。

> プリンタの各種監視 と書いておられますが、各種となると相当難しいし、全ての
> メーカの全てのプリンターにとはいかないと思いますよ。
申し訳ないです。各種監視という言い方は誤りかもしれません。
今回は、「プリンタにセットされた用紙の状態の監視について」とするのがよかったと思っており
ます。
誤解を与えてしまいましたことをお詫び申し上げます。

投稿時間:2006/10/06(Fri) 11:43
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: プリンタの各種監視について
あまり細かい情報までは取得できませんが……WMI の Win32_Printer クラスを使えるかも。

各社提供の専用ツールほどに確実な方法でもありませんが、たとえば、電源On/Off/節電、
用紙残量少/用紙切れ、起動準備中/一時停止/印刷中、用紙詰まり、保守扉オープン、
トナー残量少/トナー切れといった、ごく限定された情報までの状態監視機能があります。

投稿時間:2006/10/06(Fri) 13:56
投稿者名:蒼月
Eメール:
URL :
タイトル:
Re^2: プリンタの各種監視について
魔界の仮面弁士 さん

ご回答ありがとうございます。
教えて頂いたクラスを調べて、試してみます。

投稿時間:2006/10/10(Tue) 13:55
投稿者名:蒼月
Eメール:
URL :
タイトル:
Re^3: プリンタの各種監視について
魔界の仮面弁士 さんに教えて頂いた方法を使ってみたのですが、ちょっとおかしな部分が出てきて
しまったので、質問させてください。

Win32_Printer クラスについて調べ、まずはプリンタ名の列挙をしてみようと思い、以下のコード
を実行しました。

Private Sub Command1_Click()
On Error Resume Next

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root
\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Printer", , 48)

For Each objItem In colItems
    
  Label1(0).Caption = "Name: " & objItem.Name
    Label1(1).Caption = "Name: " & objItem.Name
    Label1(2).Caption = "Name: " & objItem.Name
    Label1(3).Caption = "Name: " & objItem.Name
    Label1(4).Caption = "Name: " & objItem.Name

Next

End Sub

自分の考えになってしまいますが、予定では接続されている(印刷が可能になっている)プリンタ名
が列挙されるはずだったのですが、全て同じプリンタ名が出力されてしまいます。
これは、何が原因なのでしょうか?(クエリ式がおかしい?)

投稿時間:2006/10/10(Tue) 14:18
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: プリンタの各種監視について
> これは、何が原因なのでしょうか?(クエリ式がおかしい?)

WMI がどうとかという話ではなく……For Each ループの使い方がおかしいようですよ。


> For Each objItem In colItems
>     Label1(0).Caption = "Name: " & objItem.Name
>     Label1(1).Caption = "Name: " & objItem.Name
>     Label1(2).Caption = "Name: " & objItem.Name
>     Label1(3).Caption = "Name: " & objItem.Name
>     Label1(4).Caption = "Name: " & objItem.Name
> Next

たとえば、下記の For〜Next ループを想像してみてください。
  For I = 0 To 3
    Label1(I).Caption = CStr(I)
  Next
もしこれを、
  For I = 0 To 3
    Label1(0).Caption = CStr(I)
    Label1(1).Caption = CStr(I)
    Label1(2).Caption = CStr(I)
    Label1(3).Caption = CStr(I)
  Next
と書いてしまえば、結果が異なりますよね。For Each 〜 Next でも同じことです。

投稿時間:2006/10/10(Tue) 14:34
投稿者名:蒼月
Eメール:
URL :
タイトル:
Re^5: プリンタの各種監視について
魔界の仮面弁士 さん

回答ありがとうございます。
すいません・・・。
ディスプレイ前で赤面してしまいました。
全てのプリンタ名を取得することができました。
こんなおバカな間違いに、丁寧に回答頂きまして、本当にありがとうございます。

投稿時間:2006/10/11(Wed) 17:19
投稿者名:蒼月
Eメール:
URL :
タイトル:
Re^6: プリンタの各種監視について
時間がかかりましたが、無事紙の有無を認識して、警告の表示を出すことができました。
魔界の仮面弁士さん、本当にありがとうございました。
花ちゃんさんも、アドバイスを頂きありがとうございました。