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 :

comment détecter si une imprimante est connectée?


Sujet :

MFC

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut comment détecter si une imprimante est connectée?
    bonjour à tous,

    tout est dans le titre

    merci

  2. #2
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    ben il y as peut être des méthode plus haut-niveau, mais si CreateFile échoue sur le port LPT1 tu peut en déduire que rien n'est connecté !!

  3. #3
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    voir fonction GetPrinter avec la structure d'infos PRINTER_INFO_2
    il y a une variable status .


  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut

    J'y suis presque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    HANDLE lpHandle;
    PRINTER_INFO_2 pi2;
    DWORD dwNeeded;
    if (0==OpenPrinter(NULL, &lpHandle, NULL))
    {
    	ReportLastError();
    }
    if (0==GetPrinter(lpHandle, 2, (LPBYTE) &pi2, sizeof(PRINTER_INFO_2), &dwNeeded))
    {
    	ReportLastError();
    }
    Le OpenPrinter fonctionne, le handle semble correc, mais GetPrinter me renvoie: "erreur 6: descripteur non valide".
    Qu'entend-t-il par descripteur?

  5. #5
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    re,
    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
     
    PRINTER_INFO_2 *GetInfosPrn(const char *szprn)
    {
    	DWORD cbBuf=0;
    	DWORD cbNeeded=1000;
    	HANDLE  hPrinter;		
    	PRINTER_INFO_2 *pInfos=NULL;
     
    	// load printer driver	
    	if(OpenPrinter(szprn,&hPrinter,NULL))
    	{
     
    		GetPrinter(  
    			hPrinter,			// handle to printer of interest 
    			2,					// version of printer info data structure 
    			NULL,				// pointer to array of bytes that receives printer info. structure 
    			cbBuf,				// size, in bytes, of array of bytes 
    			&cbNeeded 			// pointer to variable with count of bytes retrieved (or required) 
    	  			  );
     
    		cbBuf=cbNeeded;
    		pInfos=(PRINTER_INFO_2 *)malloc(cbNeeded);
    		if(pInfos)
    		{
    			if(GetPrinter(hPrinter,2,(LPBYTE)pInfos,cbBuf,&cbNeeded))
    			{
    			}
    			else
    			{
    				free(pInfos);
    				ClosePrinter(hPrinter);
    				return(NULL);				
    			}
    		}
    		ClosePrinter(hPrinter);
    	}
    	return(pInfos);
    }
    la liberation est a ta charge ..

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    j'ai compris 2 choses:
    - descripteur = handle
    - il faut IMPERATIVEMENT passer le nom de l'imprimante à la fonction OpenPrinter().

    Or, je voudrais juste savoir si une imprimante (quelconque) est connectée.

  7. #7
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    si le nom n'est pas passée (NULL) c'est l'imprimante locale qui est ouverte

  8. #8
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    un detail connectée (ça veut dire installée) ou qu'il y a une imprimante sur le poste ?

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    erf, je te remercie pour ton code, mais il ne fonctionne malheureusement pas plus que le mien. Enfin, si je met le nom de mon imprimante, ça marche, mais si je met NULL, j'ai cette satanée erreur sur GetPrinter: "error6: invalid handle".

    Je suis sur win2000 (noyau NT), et j'ai l'impression que toutes ces fonctions (CreateFile, SetCommTimeouts, GetPrinter, EnumPrinters, etc.) ont un fonctionnement particulier sous 2000.

    Je viens d'essayer EnumPrinters, mais ça ne marche pas non plus...

  10. #10
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par farscape
    un detail connectée (ça veut dire installée) ou qu'il y a une imprimante sur le poste ?
    et oui, par connectée, je voulais dire "branchée". En fait, je bosse sur une imprmante qui ne s'installe pas(pas de drivers particuliers). C'est un truc un peu particulier, et je n'ai pas le droit de rentrer dans les détails.
    Mais mon problème, c'est que je dois implémenter une fonction dans mon programme qui indique à l'utilisateur si UNE imprimante est connectée.

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par matazz
    ben il y as peut être des méthode plus haut-niveau, mais si CreateFile échoue sur le port LPT1 tu peut en déduire que rien n'est connecté !!
    Ca me parait un peu hasardeux non? Le créate file peut échouer pour d'autres raisons (mon appli est multithread et j'obtiens parfois des erreurs d'E/S... mais elle sont gérées )

  12. #12
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    J'ai essayé le code suivant (utilisation de EnumPrinters):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PRINTER_INFO_2* p2 = (PRINTER_INFO_2 *)malloc(1000);
    if (!EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 2, (LPBYTE)p2, 1000, &dwBytesNeeded, &dwBytesReturned))
    {
    	ReportLastError("EnumPrinters");
    }
    Et l'erreur renvoyée est: "error 122: la zone de données passé à un appel système est insuffisante"

    J'ai ensuite essayé la même chose mais avec 10000 (à la place de 1000) pour l'allocation. Et là ça marche ...!! Je me demande quelle est la taille exacte à allouer. Mais franchement, ça marche comme ça, je ne vais pas procéder par dychotomie pour trouver la taille exacte (j'ai essayé avec siezof(PRINTER_INFO_2) et pareil: error 122...)

  13. #13
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    ça fonctionne pas comme ça !!!
    il faut faire un premiere appel pour savoir la taille a allouer :
    extrait Fonction en C (je precise)
    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
     
    PRINTER_INFO_5*	list;
    DWORD		cnt = 0;
    DWORD		sz = 0;
    int		      sl;	
     
     
    EnumPrinters( PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, &sz, &cnt );
     
    if ( (list = (PRINTER_INFO_5*) malloc( sz )) == 0 )	return 0;
    if (!EnumPrinters( PRINTER_ENUM_LOCAL, NULL, 5, (LPBYTE)list, sz, &sz, &cnt))
    	{
    		free( list );
    		return 0;
    	}

  14. #14
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    ça marche impec!!!


  15. #15
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    mhh... en fait non, je suis désolé mais je me suis trompé EnumPrinter me renvoie l'imprimante installée (et en plus, l'imprimante par défaut). Ce que je voudrais, c'est savoir quelle imprimante est connectée

  16. #16
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    et bien tu demandes la structure PRINTER_INFO_2
    au lieu de PRINTER_INFO_5
    et tu regardes la zone status .. voir MSDN

Discussions similaires

  1. comment détecter qu'une fenetre est ouverte?
    Par canary dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 15/05/2008, 14h22
  2. Comment détecter qu'une page est en cours de chargement?
    Par linar009 dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 25/08/2006, 17h43
  3. Réponses: 5
    Dernier message: 16/06/2006, 09h16
  4. Détecter si une souris est connecté...
    Par Foub dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 31/07/2005, 20h41
  5. [Delphi 6] Comment détecter si un poste est connecté ?
    Par Lung dans le forum Web & réseau
    Réponses: 81
    Dernier message: 22/04/2005, 15h13

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