IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Fin impression physique


Sujet :

MFC

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Ao�t 2002
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 26
    Par d�faut Fin impression physique
    Bonjour,

    je d�sire m'assurer de la fin d'un job d'impression (= impression de la derni�re page physique du job) avant de lancer un deuxi�me job.

    Mon probl�me est que je ne trouve pas ce genre de choses dans les API ou alors je n'ai pas du comprendre leur fonctionnement.

    J'ai vu les fonctions FindFirstPrinterChangeNotification et autres mais c'est relatif au spool d'impression si j'ai bien compris. Hors ce spool peut envoyer deux jobs vers mon imprimante quasi en m�me temps et l� j'ai des collisions de jobs(j'utilise des messages PJL pour afficher un message et le second message arrive avant la fin d'impression du premier job).

    Je pensais aussi positionner un param�tre sur l'imprimante puis le lire pour savoir si je peux envoyer mon second job en faisant une boucle d'attente, mais j'ai pas trouv� ce genre de choses non plus.

    Si quelqu'un a une quelconque id�e pour que je puisse envoyer mes jobs s�quentiellement et proprement pour �viter toute collision, �a serait cool.

    Merci de votre aide
    Ludoman

  2. #2
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut,
    tu peux parcourir la liste des jobs en cours en mettant en place un timer par exemple .
    fonctions d'exemple pour travailler sur les jobs d'impression:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    #include <Winspool.h>
    bool GetNextJobPrinter(const char *szPrinterName,int &rnLocation,JOB_INFO_1 **pInfosJob)
    {
    	DWORD cbBuf=0;
    	DWORD pcbNeeded=0,pcReturned=0;
    	HANDLE hPrinter;
     
    	CString strPrinterName=szPrinterName;
     	if(OpenPrinter(strPrinterName.GetBuffer(0),&hPrinter,NULL))
    	{	
    		cbBuf=pcbNeeded=pcReturned=0;
    		EnumJobs( 
    			hPrinter,	// handle to printer object 
    			rnLocation,	// location of first job in print queue to enumerate 
    			1,			// number of jobs to enumerate 
    			1,			// structure level 
    			(LPBYTE)NULL, // pointer to structure array 
    			cbBuf, // size of array, in bytes 
    			&pcbNeeded, // addr. of variable with no. of bytes copied (or required) 
    			&pcReturned // addr. of variable with no. of job info. structures copied 
    				);
    		if(pcbNeeded)
    		{
    			if(*pInfosJob==NULL)
    				*pInfosJob=reinterpret_cast<JOB_INFO_1 *>(malloc(pcbNeeded));			
     
    			cbBuf=pcbNeeded;
    			EnumJobs( 
    				hPrinter,	// handle to printer object 
    				rnLocation,	// location of first job in print queue to enumerate 
    				1,			// number of jobs to enumerate 
    				1,			// structure level 
    			reinterpret_cast<LPBYTE>(*pInfosJob), // pointer to structure array 
    			cbBuf, // size of array, in bytes 
    			&pcbNeeded, // addr. of variable with no. of bytes copied (or required) 
    			&pcReturned // addr. of variable with no. of job info. structures copied 
    					);
     
    			if(!pcReturned) 
    			{
    				free(*pInfosJob);
    				*pInfosJob=NULL;
    			}
    		}
    		rnLocation++;
    		ClosePrinter(hPrinter);
    	}
    	else return false;
    	return (pcReturned!=0);
    }
    //--------------------------------------------------------------
    bool FindJobPrinter(const char *szPrinterName,const char *szJobName,JOB_INFO_1 **pInfosJob)
    {
    	DWORD cbBuf=0;
    	DWORD pcbNeeded=0,pcReturned=0;
    	HANDLE hPrinter;
    	bool bokjob=false;
    	int nojob=0;
    	CString Currentjob,jobName;
     
    	jobName=szJobName;
    	jobName.MakeUpper();
    	CString strPrinterName=szPrinterName;
     	if(OpenPrinter(strPrinterName.GetBuffer(0),&hPrinter,NULL))
    	{
    		do
    		{
    			cbBuf=pcbNeeded=pcReturned=0;
    			EnumJobs( 
    				hPrinter,	// handle to printer object 
    				nojob,		// location of first job in print queue to enumerate 
    				1,			// number of jobs to enumerate 
    				1,			// structure level 
    				(LPBYTE)NULL, // pointer to structure array 
    				cbBuf, // size of array, in bytes 
    				&pcbNeeded, // addr. of variable with no. of bytes copied (or required) 
    				&pcReturned // addr. of variable with no. of job info. structures copied 
    					);
    			if(pcbNeeded)
    			{
    				if(*pInfosJob==NULL)
    				*pInfosJob=reinterpret_cast<JOB_INFO_1 *>(malloc(pcbNeeded));			
    				cbBuf=pcbNeeded;
    				EnumJobs( 
    					hPrinter, // handle to printer object 
    					nojob,	  // location of first job in print queue to enumerate 
    					1,		  // number of jobs to enumerate 
    					1,		  // structure level 
    				reinterpret_cast<LPBYTE>(*pInfosJob), // pointer to structure array 
    				cbBuf, // size of array, in bytes 
    				&pcbNeeded, // addr. of variable with no. of bytes copied (or required) 
    				&pcReturned // addr. of variable with no. of job info. structures copied 
    						);
     
    				if(pcReturned)
    				{	
    					Currentjob=(*pInfosJob)->pDocument;
    					Currentjob.MakeUpper();
    					bokjob=(Currentjob==jobName);
    				}
    			}
    			nojob++;
    			if(bokjob)	break;			
     
    			free(*pInfosJob);
    			*pInfosJob=NULL;
     
    		}
    		while(pcbNeeded);
    		ClosePrinter(hPrinter);
    	}
    	return bokjob;
    }
    //---------------------------------------
    JOB_INFO_1 *pInfosJob=NULL;
    if(FindJobPrinter("My Printer HP","Microsoft Word - toto.doc",&pInfosJob))
    	{
                    // traitement
    		//.............
     
                    // liberation
    		free(pInfosJob);
    	}

  3. #3
    Membre averti
    Inscrit en
    Ao�t 2002
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 26
    Par d�faut
    tout d'abord merci pour ta r�ponse

    le probl�me c'est que la fonction EnumJobs ne va lister que les jobs qui sont en attente de spool au niveau de l'imprimante.

    Mon probl�me se situe juste apr�s, je voudrais avoir l'information qui vienne de l'imprimante et pas de son spool en fait.

    Ex : je lance un job de 4 pages, d�s qu'il est spool�, je ne le vois plus dans le spool de l'imprimante alors que la 1ere page n'a pas fini d'imprimer. Du coup il n'appara�t plus dans mon EnumJobs et je ne sais pas quand il est r�ellement fini d'imprimer.

    Existe t-il des API qui remontent des informations de l'imprimante ?

  4. #4
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    je ne pense pas .
    je ne vois pourquoi �a te pose un probleme ,le job disparait si il est entierement pris en charge par l'imprimante (en m�moire).
    et pas si il est entierement spoul� ...
    donc si le spouleur ne fait plus apparaitre l'info c'est que l'imprimante a toutes les infos en memoire.



Discussions similaires

  1. [WD12] Savoir si on est sur une impression "physique"
    Par Christophe Charron dans le forum WinDev
    R�ponses: 2
    Dernier message: 07/10/2012, 18h42
  2. R�ponses: 3
    Dernier message: 18/03/2008, 15h49
  3. Lancer l'impression � la fin du chargement de la page
    Par afrodje dans le forum G�n�ral JavaScript
    R�ponses: 2
    Dernier message: 27/08/2007, 14h57
  4. Attendre la fin de l'impression avec "ShellWait"
    Par Scuba69 dans le forum VBA Access
    R�ponses: 1
    Dernier message: 03/06/2007, 10h23
  5. Apparition de "|" en fin de ligne � l'impression du ps
    Par leaMarianna dans le forum Math�matiques - Sciences
    R�ponses: 1
    Dernier message: 30/05/2007, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo