public ServicePrintMonitor() { Log.Info("-- Se levanta el Servicio para Monitorizar el Servicio de Impresión --"); InitializeComponent(); Log.Info("-- Nos suscribimos a los eventos de impresión --"); EventMonitorPrinting.PrintingEven(); // Descomentar para suscribirnos a los eventos de creación de ficheros de spool Log.Info("Nos suscribimos a los eventos de creación de ficheros de Spool"); WatchIO.FileEvent(LocalPrinting.PathPrintSpool()); // Definimos un Timer para lanzar una tarea de forma periodica. Tiempo = new Timer(); Tiempo.Interval = 3600000; // 1 hora //Tiempo.Interval = 10000; // 10 sg //Tiempo.Elapsed += new ElapsedEventHandler(Metodo_delegado a ejecutar); //Tiempo.Elapsed += new ElapsedEventHandler(Programa.PruebaServicio); //Tiempo.Elapsed += new ElapsedEventHandler(Programa.Inicio); // Tarea periodica: Comprobar que estamos suscritos a los eventos de impresión Log.Info("Lanzamos EventMonitorPrinting.IsAliveEvents() de forma periódica"); Tiempo.Elapsed += new ElapsedEventHandler(EventMonitorPrinting.IsAliveEvents); // Descomentar para la suscripción a los eventos de creación de ficheros de spool Tiempo.Elapsed += new ElapsedEventHandler(WatchIO.IsAliveEvents); //Fecha = DateTime.Now.ToShortDateString().Replace("/", "-"); }
/// <summary> /// Punto de entrada principal para la aplicación. /// </summary> static void Main() //static void descomentar_linea_anterior_para_generar_instalador() { /// Leemos la configuración de App.config para log4net y generar archivos de log //Path de los ejecutables del Servicio Monitor de Impresión string PathAppConfig = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); // Nombre fichero ejecutable del Servicio Monitor de Impresión string NameAppConfig = System.IO.Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().Location); Log.Info("PATH de App.config: " + PathAppConfig + @"\" + NameAppConfig + ".config"); // Aviso reinicio servicio //Log.Warn("Se reinicia el servicio Monitor Impresion"); /// Inicializamos log4net para que recargue configuración en tiempo de ejecución System.IO.FileInfo FileAppConfig = new System.IO.FileInfo(PathAppConfig + @"\" + NameAppConfig + ".config"); log4net.Config.XmlConfigurator.ConfigureAndWatch(FileAppConfig); Log.Info(""); Log.Info(""); Log.Info(""); Log.Info(""); Log.Info(""); Log.Info(""); Log.Info(""); Log.Info("==========================================================================================="); Log.Info("----------- ------------"); Log.Info("----------- INICIAMOS EL MONITOR DE IMPRESION ------------"); Log.Info("----------- ------------"); Log.Info("==========================================================================================="); Log.Info("Directorio de Spool: " + LocalPrinting.PathPrintSpool()); // Revisamos la congiguracion de las impresoras. Se actualizan sus propiedades en caso necesario para que se guarden los documentos impresos LocalPrinting.ConfigurePrinters(); ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new ServicePrintMonitor() }; ServiceBase.Run(ServicesToRun); }
} //AnalizePrintJob() /** \brief Almacena documentos después de impresión * \details Comprueba las propiedades de la impresora para ver si se almacenan los documentos después de su impresión. * Si no se almacenan se cambia la propiedad para que se almacen. * \param Printer Nombre de la impresora * http://www.codeproject.com/Articles/6899/Changing-printer-settings-using-C */ public bool KeepSpoolFiles(string Printer) { IntPtr WphPrinter; STRUCT_API_PRINTING.PRINTER_DEFAULTS WpPrinterDefaults = new STRUCT_API_PRINTING.PRINTER_DEFAULTS(); var PrinterInfo5 = new STRUCT_API_PRINTING.PRINTER_INFO_5(); IntPtr pPrinterInfo5 = IntPtr.Zero; bool ConfiguracionCorrecta = false; /// Abrimos la impresora y obtenemos el identificador interno de la impresora if (OpenPrinter(Printer, out WphPrinter, ref WpPrinterDefaults)) { Log.Info("Este es el contenido de WphPrinter: #" + WphPrinter.ToString() + "."); /// Obtenemos las propiedades de la impresora PrinterInfo5 = GetPrinter5(WphPrinter); ///Cerramos la impresora ClosePrinter(WphPrinter); /// Establecemos las propiedades para actualizar la impresora PrinterInfo5.pPrinterName = Printer; PrinterInfo5.pPortName = LocalPrinting.PrinterPortName(Printer); Log.Debug("PrinterInfo5.pPrinterName: " + PrinterInfo5.pPrinterName); Log.Debug("PrinterInfo5.pPortName: " + PrinterInfo5.pPortName); Log.Debug("PrinterInfo5.Attributes: " + PrinterInfo5.Attributes.ToString()); Log.Debug("PrinterInfo5.device_not_selected_timeout: " + PrinterInfo5.device_not_selected_timeout.ToString()); Log.Debug("PrinterInfo5.transmission_retry_timeout: " + PrinterInfo5.transmission_retry_timeout.ToString()); /// Si no se guardan los ficheros del spool de impresión: uint flag = (uint)PrinterInfo5.Attributes & (uint)ENUM_API_PRINTING.ATTRIBUTE_PRINTER_INFO.PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS; if (flag == 0) // No se guardan, No está activo el bit para guardar los trabajos de impresión { Log.Info("La impresora " + Printer + " no guarda los ficheros de Spool de impresión."); /// - Modificamos el atributo de impresora para que guarde los ficheros de Spool PrinterInfo5.Attributes += (uint)ENUM_API_PRINTING.ATTRIBUTE_PRINTER_INFO.PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS; /// - Abrimos la impresora con permiso de administardor para modificar sus propiedades WpPrinterDefaults.DesiredAccess = STRUCT_API_PRINTING.PRINTER_ACCESS_MASK.PRINTER_ACCESS_ADMINISTER; if (!OpenPrinter(Printer, out WphPrinter, ref WpPrinterDefaults)) { Log.Fatal("No se tiene acceso como Administrador a la impresora: -" + Printer); } Log.Info("-- Abrimos la impresora: " + Printer + " en modo Administrador."); // - Asignamos el puntero al struc con las propiedades de la impresora pPrinterInfo5 = Marshal.AllocHGlobal(Marshal.SizeOf(PrinterInfo5)); Marshal.StructureToPtr(PrinterInfo5, pPrinterInfo5, false); /// - Establecemos las propiedades SetPrinter5(WphPrinter, ref pPrinterInfo5); /// - Cerramos la impresora Log.Info("-- Cerramos la impresora: " + Printer + " en modo Administrador."); ClosePrinter(WphPrinter); } // end if ConfiguracionCorrecta = true; } else { Log.Info("No se ha podido encontrar la impresora: -" + Printer); } // end if principal return(ConfiguracionCorrecta); } // KeepSpoolFiles()
/** \brief Test creación archivo * \details Creamos un archivo para testear si estamos suscritos a los eventos de Sistema de Archivos */ public static void IsAliveEvents(object sender, EventArgs Args) { Log.Debug("IsAliveEvents(INICIO) -> Valor de IsEvenCapture: " + IsEvenCapture.ToString()); // Vamos a chequear si estamos suscritos a los eventos del Sistema de Archivos Log.Debug("IsAliveEvents -> Ponemos la variable de control IsEvenCampture = false"); IsEvenCapture = false; // Creamos un fichero para que se produzca un evento de creación de archivo del Sistema de Archivos Log.Debug("Creamos el fichero de testeo: " + LocalPrinting.PathPrintSpool() + @"\" + "test.SPL"); File.Create(LocalPrinting.PathPrintSpool() + @"\" + "test.SPL").Dispose(); //Esperamos 3000 milisegundos Log.Debug("IsAliveEvents -> Esperamos 3 sg"); System.Threading.Thread.Sleep(3000); // Borramos los ficheros de test try { File.Delete(LocalPrinting.PathPrintSpool() + @"\" + "test.SPL"); } catch (Exception e) { Log.Error("No se ha podido borrar el fichero de test: " + LocalPrinting.PathPrintSpool() + @"\" + "test.SPL"); } try { File.Delete(LocalPrinting.PathPrintSpool() + @"\" + _DIR_SPOOL_BACKUP + @"\" + "test.SPL"); } catch (Exception e) { Log.Error("No se ha podido borrar el fichero de test: " + LocalPrinting.PathPrintSpool() + @"\" + _DIR_SPOOL_BACKUP + @"\" + "test.SPL"); } /* * Chequeamos la variable de control para ver si efectivamente estamos suscritos. * Si estamos subscritos está variable se tenía que haber actualizado a través del metodo suscrito * OnCreated(). * * En caso de que no estemos suscritos lanzamos el método FileEvent() para subscribir el método * OnCreated(). */ if (IsEvenCapture) { Log.Info("Suscripción método WatchIO.OnCreated() a eventos del Sistema Archivos: OK"); } else { Log.Error("No suscrito a los eventos del Sistema Archivos. Nos suscribimos."); try { FileEvent(LocalPrinting.PathPrintSpool()); IsEvenCapture = true; } catch (Exception e) { Log.Error(e); } } } //Fin IsAliveEvents()