OH5-Print-Installer_Batch/Assets/UTAX/test.ps1
2025-11-03 15:44:27 +01:00

78 lines
3.2 KiB
PowerShell

Add-Type -Language CSharp -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class PrinterConfig {
[DllImport("winspool.drv", SetLastError = true)]
public static extern bool OpenPrinter(string pPrinterName, out IntPtr hPrinter, IntPtr pDefault);
[DllImport("winspool.drv", SetLastError = true)]
public static extern bool ClosePrinter(IntPtr hPrinter);
[DllImport("winspool.drv", SetLastError = true)]
public static extern int DocumentProperties(IntPtr hwnd, IntPtr hPrinter, string pDeviceName,
IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode);
public const int DM_COLOR = 0x800;
public const short DMCOLOR_MONOCHROME = 1;
public const short DMCOLOR_COLOR = 2;
public const int DM_IN_BUFFER = 0x8;
public const int DM_OUT_BUFFER = 0x2;
public static void SetPrinterToMonochrome(string printerName) {
IntPtr hPrinter;
if (!OpenPrinter(printerName, out hPrinter, IntPtr.Zero)) {
throw new Exception("Drucker konnte nicht geöffnet werden.");
}
// Erste Abfrage: Wie groß ist der DEVMODE?
int sizeNeeded = DocumentProperties(IntPtr.Zero, hPrinter, printerName, IntPtr.Zero, IntPtr.Zero, 0);
if (sizeNeeded <= 0) {
ClosePrinter(hPrinter);
throw new Exception("Konnte DEVMODE-Größe nicht ermitteln.");
}
// Speicher allokieren für Input & Output DEVMODE
IntPtr pDevModeInput = Marshal.AllocHGlobal(sizeNeeded);
IntPtr pDevModeOutput = Marshal.AllocHGlobal(sizeNeeded);
// DEVMODE vom Drucker holen
int getDevModeResult = DocumentProperties(IntPtr.Zero, hPrinter, printerName, pDevModeInput, IntPtr.Zero, 0);
if (getDevModeResult < 0) {
ClosePrinter(hPrinter);
Marshal.FreeHGlobal(pDevModeInput);
Marshal.FreeHGlobal(pDevModeOutput);
throw new Exception("Konnte DEVMODE nicht vom Drucker abrufen.");
}
// Lesen und bearbeiten
int offset = 104; // typischer Offset von dmColor innerhalb DEVMODE (abhängig vom Treiber!)
byte[] devmodeData = new byte[sizeNeeded];
Marshal.Copy(pDevModeInput, devmodeData, 0, sizeNeeded);
// Setze das dmColor-Feld auf MONOCHROME (1)
devmodeData[offset + 0] = (byte)(DMCOLOR_MONOCHROME & 0xFF); // Low Byte
devmodeData[offset + 1] = (byte)((DMCOLOR_MONOCHROME >> 8) & 0xFF); // High Byte
// Setze dmFields (aktiviert die Einstellung) Bit 11 (0x800)
devmodeData[76] |= 0x00; // low byte bleibt gleich
devmodeData[77] |= 0x08; // high byte |= 0x08 0x800 aktiviert DM_COLOR
Marshal.Copy(devmodeData, 0, pDevModeInput, sizeNeeded);
// Setzen des neuen DEVMODEs
int setResult = DocumentProperties(IntPtr.Zero, hPrinter, printerName, pDevModeOutput, pDevModeInput, DM_IN_BUFFER | DM_OUT_BUFFER);
if (setResult < 0) {
throw new Exception("Setzen des bearbeiteten DEVMODE fehlgeschlagen.");
}
ClosePrinter(hPrinter);
Marshal.FreeHGlobal(pDevModeInput);
Marshal.FreeHGlobal(pDevModeOutput);
}
}
"@
# 🎯 Name deines Druckers
[PrinterConfig]::SetPrinterToMonochrome("2508ci KX")