I would like to print on two-sided (duplex), for this I use :
#include <windows.h>
#include <winspool.h>
void SetDuplexPrinting(HANDLE hPrinter) {
PRINTER_INFO_2 *pPrinterInfo = NULL;
DWORD dwNeeded = 0;
GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded);
pPrinterInfo = (PRINTER_INFO_2 *)malloc(dwNeeded);
GetPrinter(hPrinter, 2, (LPBYTE)pPrinterInfo, dwNeeded, &dwNeeded);
DEVMODE *pDevMode = pPrinterInfo->pDevMode;
if (pDevMode) {
pDevMode->dmFields |= DM_DUPLEX;
pDevMode->dmDuplex = DMDUP_VERTICAL; // or DMDUP_HORIZONTAL
LONG result = DocumentProperties(NULL, hPrinter, pPrinterInfo->pPrinterName, pDevMode, pDevMode, DM_IN_BUFFER | DM_OUT_BUFFER);
if (result != IDOK) {
// Handle the error
}
}
free(pPrinterInfo);
}
int main() {
HANDLE hPrinter;
DOC_INFO_1 DocInfo;
DWORD dwJob;
// Open the printer
if (OpenPrinter("Printer name", &hPrinter, NULL)) {
SetDuplexPrinting(hPrinter);
// Set document information
DocInfo.pDocName = "My Document";
DocInfo.pOutputFile = NULL;
DocInfo.pDatatype = "RAW";
// Start the print job
dwJob = StartDocPrinter(hPrinter, 1, (LPBYTE)&DocInfo);
if (dwJob > 0) {
StartPagePrinter(hPrinter);
// Writing data to the printer with WritePrinter
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
} else {
// Handle the error
}
ClosePrinter(hPrinter);
} else {
// Handle Printer Opening Error
}
return 0;
}
but my HP printer prints one sided.
what is strange, StartDocPrinter() does not even use the default settings that I changed in Windows (duplex long edge).
Thanks