私がやるなら、、、
手動で印刷、オフライン、用紙なしの状態にしておいて、以下コード(コピペです)が期待通りとなるか試しますね。
pr_ret = win32print.GetPrinter( hPrinter, 6 )
print( f"プリンタステータス:0x{pr_ret['Status']:08x}" )
Like!
Windows10でプリンタ制御をしています。
印刷自体はできるのですが、印刷中やエラー状態を取得することが出来ません。
アプリの中で印刷中やエラー状態を画面で表示したいので
プリンタの状態を取得する方法は無いでしょうか?
開発環境は以下の通りです。
Windows10
python3.9
ブラザーのプリンタをイーサネットで接続しPortをTCP/IPポートで接続しています。
例)
WindowsのAPIを呼び出す為にwin32printingを使用しています。
印刷する為に以下のコードを実行します。
printer_name = win32print.GetDefaultPrinter()
hPrinter = win32print.OpenPrinter( printer_name )
hDC = win32ui.CreateDC ()
hDC.StartDoc(image_path)
hDC.StartPage()
// ここで画像を作成して screenは印刷する画像イメージです。
dib = ImageWin.Dib( screen )
dib.draw( hDC.GetHandleOutput(), (0, 0, int(screen.width*2), int(screen.height*2)) )
hDC.EndPage ()
hDC.EndDoc ()
hDC.DeleteDC ()
ジョブに追加されるので以下の処理をループさせて
プリンタの状態を取得しようとGetPrinterしていますが取得できません。
pr_ret = win32print.GetPrinter( hPrinter, 6 )
print( f"プリンタステータス:0x{pr_ret['Status']:08x}" )
印刷ジョブを実行した後、印刷中のステータスになるかと思ったのですが
全くステータスが取得できていません。
その他、用紙なし等も取得できません。
win32printのGetPrinterは状態を取得する関数だと思っているのですが
呼び出すタイミングや呼び出し方に制限があるのでしょうか?
私がやるなら、、、
手動で印刷、オフライン、用紙なしの状態にしておいて、以下コード(コピペです)が期待通りとなるか試しますね。
pr_ret = win32print.GetPrinter( hPrinter, 6 )
print( f"プリンタステータス:0x{pr_ret['Status']:08x}" )
@oota_torao
Questioner@oota_torao
Questioner@oota_torao
Questioner@oota_torao
Questioner@oota_torao
Questioner@oota_torao
Questioner@oota_torao
Questioner即興で書いてみました。ctypesを使ってゴリゴリ呼ぶ方式です。
これでもタイムリーに取れないってことであれば、Windowsの仕様でしょう。
import sys
import ctypes
import ctypes.wintypes
class PRINTER_INFO_6(ctypes.Structure):
_fields_ = [
("dwStatus", ctypes.wintypes.DWORD),
]
winspool = ctypes.WinDLL("Winspool.drv")
PrinterName = ctypes.wintypes.LPSTR(b"プリンター名")
hPrinter = ctypes.wintypes.HANDLE()
dwNeeded = ctypes.wintypes.DWORD()
ret = winspool.OpenPrinterA(PrinterName.value, ctypes.byref(hPrinter), None)
if ret == 0:
raise Exception("OpenPrinterA failed")
winspool.GetPrinterA(hPrinter, 6, None, 0, ctypes.byref(dwNeeded))
Printer=(ctypes.c_ubyte * dwNeeded.value)()
ret = winspool.GetPrinterA(hPrinter, 6, Printer, dwNeeded, ctypes.byref(dwNeeded))
if ret == 0:
raise Exception("GetPrinterA failed")
pInfo = ctypes.cast(Printer, ctypes.POINTER(PRINTER_INFO_6))
dwStatus = pInfo.contents.dwStatus
print("dwStatus:", dwStatus)
ベンダのSDKを使えば確実ですかね。