public void Start() { if (!WinSpool.OpenPrinter(printerName, out hPrinter, IntPtr.Zero)) { var errorCode = Marshal.GetLastWin32Error(); throw new SpoolWatcherException($"Error in OpenPrinter: {errorCode}"); } var printerNotifyOptions = new PrinterNotifyOptions(); printerNotifyOptions.Version = 2; var optionsType = CreateOptionsType(); printerNotifyOptions.Count = (uint)optionsType.Count(); var pNotifyOptionsSz = Marshal.SizeOf <PrinterNotifyOptions>(); printerNotifyOptions.pTypes = Marshal.AllocHGlobal(pNotifyOptionsSz * optionsType.Count()); for (int i = 0; i < optionsType.Count(); i++) { var ptr = IntPtr.Add(printerNotifyOptions.pTypes, i * pNotifyOptionsSz); Marshal.StructureToPtr(optionsType.ElementAt(i), ptr, false); } notificationHandle = WinSpool.FindFirstPrinterChangeNotification(hPrinter, PrinterChange, (uint)printerNotifyCategory, ref printerNotifyOptions); foreach (var optionType in optionsType) { Marshal.FreeHGlobal(optionType.pFields); } Marshal.FreeHGlobal(printerNotifyOptions.pTypes); if (notificationHandle.IsInvalid) { var errorCode = Marshal.GetLastWin32Error(); throw new SpoolWatcherException($"Error in FindFirstPrinterChangeNotification: {errorCode}"); } stopEvent.Reset(); tNotifications = new Thread(() => WaitForNotifications()); tNotifications.Start(); }
private static extern bool FindNextChangeNotification(SafeNotificationHandle hChangeHandle);
public static unsafe extern CONFIGRET CM_Register_Notification( [Friendly(FriendlyFlags.In)] CM_NOTIFY_FILTER *pFilter, void *pContext, CM_NOTIFY_CALLBACK pCallback, out SafeNotificationHandle pNotifyContext);
internal static extern bool FindNextPrinterChangeNotification(SafeNotificationHandle hChange, out PrinterChange pdwChange, PrinterNotifyOptions printerNotifyOptions, out SafePrinterNotifyInfo pPrinterNotifyInfo);