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