Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
joaotande

Monitorar e controlar Fila de impressão do windows via C++

Recommended Posts

beleza Pessoal?

O problema é o seguinte! Estou fazendo um programa em Visual C++ express para controlar as impressões do computador da minha escola! La existe um PC com uma impressora local ligada diretamente ao computador(creio que isso não seja um pleonasmo). Como várias pessoas utilizam essa impressora e esse computador, a ideia é que quando alguém for imprimir um arquivo, surgisse uma tela pedindo um login e uma senha, para que seja possível saber quem imprimiu e quantas páginas imprimiu, além de outras coisas mais...

Pois bem... Com essa ideia inicial, pensei em criar um programa para monitorar a fila de impressão do windows... Dai quando um arquivo aparecer por lá é só pausar este arquivo e mandar exibir a tela pedindo a senha... caso a senha seja válida, basta liberar a impressão... se a senha for errada e o usuário cancelar a impressão, basta o programa deletar o documento da fila...

Primeiro consegui arrumar um código que lista todas as impressoras que existem no computador, além de nome, porta que ta instalada e tudo mais... Depois consegui outro código que lista quantos documentos exitem na fila de cada impressora, além do número de páginas, e mais um tanto de coisa!

Até ai meu projeto está andando... O problema ta ocorrendo agora na hora de eu pausar um arquivo! exitem dois meios... Ou eu pauso o arquivo na hora que ele entra na impressora... ou eu deixo a impressora pausada e quando um arquivo entrar, e a senha for válida, eu "despauso" a impressora!

Arrumei o seguinte código que pausa ou "despausa" um arquivo da fila de impressão:

SetJob(pi, ji[0].JobId, 2, (BYTE*)ji, JOB_CONTROL_RESUME);

Essa linha realmente pausa qualquer arquivo! eu entro na fila e vejo ele pausado! porém, segundo a documentação, quando ela da certo é pra função retornar 1... mais mesmo funcionando retorna 0 =/

Além disso tambem consegui uma função que pausa a impressora inteira! mais não consigo fazer ela funcionar(setar ela)... apesar do programa rodar, a função sempre retorna 0, e mesmo assim não pausa a impressora:

SetPrinter(pi, 0, NULL, PRINTER_CONTROL_RESUME);

Por último vem o mais estranho! ontem fui dormir e deixei isso de lado! hoje de manha levantei e fui imprimir um relátorio antes de ir trabalhar.... Qual minha surpresa ao perceber que a impressora não imprimia! euaeuah Quando fui vem os documentos ja estavam entrando "pausados" na fila de impressão mesmo sem meu programa ... e mesmo quando eu "despausava" eles na mão passavam alguns décimos de segundo e eles voltavam a ser pausados! Quando eu "despausava" utilizando meu software eles nao pausavam mais... mas também não imprimia! Pra conseguir imprimir eu tive que mandar imprimir! e em seguida, bem rápido despausar utilizando meu programa!

POR FIM MINHA DÚVIDA!!

Alguém pode me ajudar com essas funções de pausar a impressora e os documentos? ja tentei de tudo e não consigo fazer elas funcionarem...

Segue abaixo meu código fonte! (ta meio bagunçado ainda).

#include "stdafx.h"

#include<windows.h>

#include<winspool.h>

#include<stdio.h>

#include<conio.h>

int _tmain(int argc, _TCHAR* argv[])

{

//Variaveis para pegar os nomes das impressoras!

DWORD dwSizeNeeded;

DWORD dwNumItems;

DWORD dwItem;

LPPRINTER_INFO_2 lpInfo = NULL;

PRINTER_INFO_2 *lpInfo2;

int ver;

ver = 32;

// Aqui armazena as informações das impressoras na variavel lpInfo

// para usar o nome de uma impressora basta chamar lpInfo[2].pPrinterName

EnumPrinters ( PRINTER_ENUM_LOCAL, NULL ,2, NULL, 0, &dwSizeNeeded, &dwNumItems);

//lpInfo = (LPPRINTER_INFO_2)HeapAlloc ( GetProcessHeap (), HEAP_ZERO_MEMORY, dwSizeNeeded );

lpInfo2 =(PRINTER_INFO_2*)new char[dwSizeNeeded];

//EnumPrinters ( PRINTER_ENUM_LOCAL, NULL,2, (LPBYTE)lpInfo, dwSizeNeeded, &dwSizeNeeded, &dwNumItems);

EnumPrinters ( PRINTER_ENUM_LOCAL, NULL,2, (BYTE*)lpInfo2, dwSizeNeeded, &dwSizeNeeded, &dwNumItems);

HANDLE pi; // variavel para abrir a impressora

DWORD mx, nj, i;

JOB_INFO_2 *ji;

//for ( dwItem = 0; dwItem < dwNumItems; dwItem++ )

//{

//abre a impressora desejada

if(OpenPrinter(lpInfo2[0].pPrinterName, π, NULL))//printf("\n\nAbriu impressora %d\n", dwItem);

//printf ( "Nome da impressora: %s\n" , lpInfo[dwItem].pPrinterName );

//carrega o tamanho de buffer necessario de todos os trabalhos

//da impressora aberta

EnumJobs(pi, 0, -1, 2, NULL, 0, &mx, &nj);

printf("Precisa de %u bytes\n", mx);

// Aloca a memoria necessária para armazena

//as informações dos trabalhos que estão na impressora na variavel "ji"

ji=(JOB_INFO_2*)new char[mx];

//armazena as informações na variavel "ji" e retorna 0 se der erro.

if (EnumJobs(pi, 0, -1, 2, (BYTE*)ji, mx, &mx, &nj)){

//Mostra quantos trabalhos estão na fila de impressão!

printf("Listou %u\n", nj);

//Lista JobId = Número do trabalho na fila

// pDocument = Tipo de documento (word, excel, power point, etc)

// PagesPrinted = Número de Páginas que ja foram impressas

// TotalPages = Número total de páginas

for(i=0; i<nj; i++)

printf("Job %u:\n ID: %u\n Documento: %s\n Paginas: %u/%u\n", i+1, ji.JobId, ji.pDocument, ji.PagesPrinted, ji.TotalPages);

}

//ver = SetPrinter(pi, 0, NULL, PRINTER_CONTROL_PURGE);

//ver = SetJob(pi, ji[0].JobId, 2, (BYTE*)ji, JOB_CONTROL_RESUME);

//ver = SetPrinter(pi, 0, NULL, PRINTER_CONTROL_RESUME);

printf("\n\n\nbabacao %d\n\n\n", ver);

getch();

delete ji;

ClosePrinter(pi);

//}

//getch();

return 0;

}

Editado por joaotande

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×