Example #1
0
        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);
Example #3
0
 public static unsafe extern CONFIGRET CM_Register_Notification(
     [Friendly(FriendlyFlags.In)] CM_NOTIFY_FILTER *pFilter,
     void *pContext,
     CM_NOTIFY_CALLBACK pCallback,
     out SafeNotificationHandle pNotifyContext);
Example #4
0
 internal static extern bool FindNextPrinterChangeNotification(SafeNotificationHandle hChange, out PrinterChange pdwChange, PrinterNotifyOptions printerNotifyOptions, out SafePrinterNotifyInfo pPrinterNotifyInfo);