En este post te quiero compartir un código de C++ para listar y cancelar trabajos de impresión de la cola de impresión de una impresora en Windows.
Con el código C++ vamos a usar la API de Windows (win32) con EnumJobs para obtener los trabajos de impresión de una impresora determinada, y después, opcionalmente, podremos cancelar ese trabajo con SetJob
ya sea basándonos en el índice, usuario o cualquier otro dato del trabajo.
Abriendo impresora y listando trabajos
Comenzamos obteniendo un manejador de la impresora a partir de su nombre:
Luego enumeramos los trabajos de impresión:
Si hay trabajos, los recorremos:
Cancelar trabajo de impresión
La línea que cancela el trabajo de impresión es SetJob con la opción JOB_CONTROL_CANCEL y ya está dentro del ciclo que te mostré en el apartado anterior:
SetJob(manejadorImpresora, trabajoDeImpresion[indice].JobId, 0, nullptr, JOB_CONTROL_CANCEL);
De hecho no es obligatorio que imprimas los datos de los trabajos pendientes. También puedes hacer un if revisando el id, usuario, etcétera para saber si deberías cancelar el trabajo de impresión.
Código completo
El código completo queda como se ve a continuación. He encerrado todo el comportamiento en una función que puedes invocar desde el main. Dicha función recibe el nombre de la impresora tal y como aparece en el panel de control:
Para compilarlo hay que pasar el parámetro -lwinspool
así:
g++ main.cpp -lwinspool -o cola_impresion.exe