78 lines
3.2 KiB
PowerShell
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")
|