Pythonwin32printモジュールを使用してプリンタトレイを変更しようとしていますが成功しません。プリンタは2つの「ビン」をサポートします:7=自動および4=手動。「手動」ビンから印刷ジョブを開始したい。ここにいくつかのコードがあります:
import win32print
import win32gui
# Constants from wingdi.h
DM_OUT_BUFFER = 0x02
DM_IN_BUFFER = 0x08
DM_IN_PROMPT = 0x04
DM_DEFAULT_SOURCE = 0x200
# Get a handle for the default printer
device_name = win32print.GetDefaultPrinter()
handle = win32print.OpenPrinter(device_name)
# Get the default properties for the printer
properties = win32print.GetPrinter(handle, 2)
devmode = properties['pDevMode']
# Print the default paper source (prints '7' for 'Automatically select')
print(devmode.DefaultSource)
# Change the default paper source to '4' for 'Manual feed'
devmode.DefaultSource = 4
devmode.Fields = devmode.Fields | DM_DEFAULT_SOURCE
# Write these changes back to the printer
win32print.DocumentProperties(None, handle, device_name, devmode, devmode, DM_IN_BUFFER | DM_OUT_BUFFER)
# Confirm the changes were updated
print(devmode.DefaultSource) # Aaargh! Prints '7' again!
# Start printing with the device
hdc = win32gui.CreateDC('', device_name, devmode)
win32print.StartDoc(hdc, ('Test', None, None, 0))
win32print.StartPage(hdc)
# ... GDI drawing commands ...
win32print.EndPage(hdc)
win32print.EndDoc(hdc)
明らかに、PyDEVMODE構造が更新されていないか、何らかの理由でドライバーが私の変更を拒否しました。
次の行の場合:
win32print.DocumentProperties(None, handle, device_name, devmode, devmode, DM_IN_BUFFER | DM_OUT_BUFFER)
次のように変更されます:
win32print.DocumentProperties(None, handle, device_name, devmode, devmode, DM_IN_PROMPT | DM_IN_BUFFER | DM_OUT_BUFFER)
次に、[印刷]ダイアログが表示され、そこから給紙元を変更できます。これらの変更は、devmode構造に正しくコピーされ、手差しトレイから期待どおりに印刷されます。
したがって、私の問題は、PyDEVMODE構造への変更が再マーシャリングされないため、構造がDocumentPropertiesに再送信されると失われることだと思います。何か案は?どうもありがとう。