WritePrinter

WritePrinterで、印刷データを送って、印刷する。

WritePrinter function (Winspool.h) - Win32 apps | Microsoft Docs
コンソールアプリケーションで標準印刷出力を使う方法
https://support.microsoft.com/ja-jp/help/138594/howto-send-raw-data-to-a-printer-by-using-the-win32-api
ドライバを使わず印刷する - 限られた空間の中何を残せるだろう...

実行ファイル横にtest_text.txtを用意し、それを読み込んでプリンタに書き込んで、印刷する。

shlwapi.libが要るのでリンク
shlwapi.libが要るのでリンク

shlwapi.libが要るのでリンク。

test_text.txtはこのような内容
test_text.txtはこのような内容

test_text.txtはこのような内容。

書き込まれたバイト数dwWrittenを出力。
実行すると、

C:\Users\bg1\Documents\test>WritePrinter.exe
tszModulePath = C:\Users\bg1\Documents\test\test_text.txt
dwFileSize = 181
Default Printer: EPSON PX-S06 Series
hPrinter = 0x0076296c
dwJob = 28
dwWritten = 181

C:\Users\bg1\Documents\test>

となり、

test_text.txtが印刷された
test_text.txtが印刷された

test_text.txtが印刷された。

Sample/winapi/WritePrinter/WritePrinter/src/WritePrinter at master · bg1bgst333/Sample · GitHub

StartDocPrinter

StartDocPrinterで、印刷するドキュメントの開始を通知する。

StartDocPrinter function (Winspool.h) - Win32 apps | Microsoft Docs

GDI Print APIのStartDocに相当する。
印刷ジョブIDを返す。

DOC_INFO_1で、ドキュメント情報を渡す。

C:\Users\bg1\Documents\test>StartDocPrinter.exe
Default Printer: EPSON PX-S06 Series
hPrinter = 0x0052b39c
dwJob = 27

C:\Users\bg1\Documents\test>

印刷ジョブIDが返ってくる。

キューにジョブが残ってるのは気になるが。
キューにジョブが残ってるのは気になるが。

EndDocPrinterも、ClosePrinterもしてるのに、キューにジョブが残ってるのは気になるが。

Sample/winapi/StartDocPrinter/StartDocPrinter/src/StartDocPrinter at master · bg1bgst333/Sample · GitHub

OpenPrinter

OpenPrinterで、プリンタのハンドルを取得する。

OpenPrinter function (Winspool.h) - Win32 apps | Microsoft Docs

既定のプリンタのハンドルを取得する。

C:\Users\bg1\Documents\test>OpenPrinter.exe
Default Printer: EPSON PX-S06 Series
hPrinter = 0x0072428c

C:\Users\bg1\Documents\test>

取得したハンドルで様々な操作ができる。

Sample/winapi/OpenPrinter/OpenPrinter/src/OpenPrinter at master · bg1bgst333/Sample · GitHub

SetDefaultPrinter

SetDefaultPrinterで、指定したプリンタを既定のプリンタにセットする。

SetDefaultPrinter function (Winspool.h) - Win32 apps | Microsoft Docs

既定のプリンタ名を取得して、その後入力フォームを出力して、そこにプリンタ名を入力すると、その後、既定のプリンタがそれになる。

Microsoft Print to PDFの文字列をコピーしておく。
Microsoft Print to PDFの文字列をコピーしておく。

Microsoft Print to PDFの文字列をコピーしておく。

C:\Users\bg1\Documents\test>SetDefaultPrinter.exe
Default Printer: EPSON PX-S06 Series
New Default Printer: 

この状態で、"Microsoft Print to PDF"を入力すると、

C:\Users\bg1\Documents\test>SetDefaultPrinter.exe
Default Printer: EPSON PX-S06 Series
New Default Printer: Microsoft Print to PDF
Default Printer: Microsoft Print to PDF

C:\Users\bg1\Documents\test>

改めて、Default Printerを確認すると、Microsoft Print to PDFになってる。

こちらでも切り替わっている
こちらでも切り替わっている

こちらでも切り替わっている。

Sample/winapi/SetDefaultPrinter/SetDefaultPrinter/src/SetDefaultPrinter at master · bg1bgst333/Sample · GitHub

GetDefaultPrinter

GetDefaultPrinterで、既定のプリンタ名を取得する。

GetDefaultPrinter function (Winspool.h) - Win32 apps | Microsoft Docs
Win32API 既定のプリンタのプリンタ名を取得する - s-kita’s blog

これもNULLでサイズを確保してから、バッファを用意して、改めて取得。

一番左の緑のチェックマークが既定のプリンタ
一番左の緑のチェックマークが既定のプリンタ

一番左の緑のチェックマークが既定のプリンタ。

C:\Users\bg1\Documents\test>GetDefaultPrinter.exe
Default Printer: EPSON PX-S06 Series

C:\Users\bg1\Documents\test>

既定のプリンタ名を取得できた。

Sample/winapi/GetDefaultPrinter/GetDefaultPrinter/src/GetDefaultPrinter at master · bg1bgst333/Sample · GitHub

PRINTER_INFO_1

PRINTER_INFO_1は、プリンタ名の他に、プリンタの説明文、プリンタに残せるコメント、などが格納されている。

PRINTER_INFO_1 structure (Winspool.h) - Win32 apps | Microsoft Docs

今回は、説明文も出力する。

実行すると、

C:\Users\bg1\Documents\test>PRINTER_INFO_1.exe
pPrnInfo1->pName = OneNote for Windows 10
pPrnInfo1->pDescription = OneNote for Windows 10,Microsoft Software Printer Driver,
pPrnInfo1->pName = Microsoft XPS Document Writer
pPrnInfo1->pDescription = Microsoft XPS Document Writer,Microsoft XPS Document Writer v4,
pPrnInfo1->pName = Microsoft Print to PDF
pPrnInfo1->pDescription = Microsoft Print to PDF,Microsoft Print To PDF,
pPrnInfo1->pName = Fax
pPrnInfo1->pDescription = Fax,Microsoft Shared Fax Driver,
pPrnInfo1->pName = EPSON PX-S06 Series
pPrnInfo1->pDescription = EPSON PX-S06 Series,EPSON PX-S06 Series,

C:\Users\bg1\Documents\test>

説明になってるのもあれば、そうでない名前空間のようなものもあって、よくわからない。

Sample/winapi/PRINTER_INFO_1/PRINTER_INFO_1/src/PRINTER_INFO_1 at master · bg1bgst333/Sample · GitHub

EnumPrinters

EnumPrintersで、プリンタ名を列挙する。

EnumPrinters function (Winspool.h) - Win32 apps | Microsoft Docs
Win32API 利用可能なプリンタを列挙する - s-kita’s blog

今回からコンソール
今回からコンソール

今回からコンソール。

空のコンソール
空のコンソール

空のコンソール。

1回NULLを渡してサイズを取得してから、LocalAllocでバッファを確保して、あらためてプリンタ情報を取得。

C:\Users\bg1\Documents\test>EnumPrinters.exe
pPrnInfo1->pName = OneNote for Windows 10
pPrnInfo1->pName = Microsoft XPS Document Writer
pPrnInfo1->pName = Microsoft Print to PDF
pPrnInfo1->pName = Fax
pPrnInfo1->pName = EPSON PX-S06 Series

C:\Users\bg1\Documents\test>

このようにプリンタ名一覧が出力された。

Sample/winapi/EnumPrinters/EnumPrinters/src/EnumPrinters at master · bg1bgst333/Sample · GitHub