Page 1 sur 1

Détecter et sélectionner une imprimante

Publié : jeu. 28/sept./2017 21:24
par omega
Bonsoir,

Je cherche à savoir s'il y a possibilité de détecter toutes les imprimantes (installées) et pouvoir sélectionner une d'entre elles avant d'imprimer.

Merci

Re: Détecter et sélectionner une imprimante

Publié : jeu. 28/sept./2017 23:39
par falsam
PrintRequester() Regarde l'exemple si dessous.
http://www.purebasic.com/french/documen ... er.pb.html

Re: Détecter et sélectionner une imprimante

Publié : ven. 29/sept./2017 12:34
par omega
Bonjour Falsam

PrintRequester() signifie préparer l'imprimante connectée (par défaut) pour l'impression. Moi je cherche à lister les imprimantes existantes (connectée ou partagées) afin de choisir (sur un combo par exemple) celle que je voudrais utiliser. Une fois l'imprimante choisie, il va falloir aussi la sélectionner (en pb). Donc, 2 questions: Détecter les imprimantes puis sélectionner celle que l'utilisateur choisira.

Je ne sais pas si cela est possible en pb.

Re: Détecter et sélectionner une imprimante

Publié : ven. 29/sept./2017 13:11
par Marc56
En ligne de commande Windows

Code : Tout sélectionner

wmic printer get name
Exemple d'intégration en PB

Code : Tout sélectionner

EnableExplicit

Enumeration    
     #Win
     #Rpt
EndEnumeration

SetGadgetFont(#PB_Any, FontID(LoadFont(#PB_Any, "Verdana", 8)))

OpenWindow(#Win, 0, 0, 500, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(#Rpt, 5, 5, WindowWidth(#win) - 10, WindowHeight(#Win) - 10)

Define Run = RunProgram("wmic", "printer get name", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)

If Run 
     While ProgramRunning(Run)
          If AvailableProgramOutput(Run)
               AddGadgetItem(#Rpt, -1, ReadProgramString(Run))
          EndIf
     Wend
     CloseProgram(Run)
     RemoveGadgetItem(#Rpt, 0) ; (enlever la première ligne de titre 'name')
Else
     AddGadgetItem(#Rpt, -1, "Erreur")
EndIf

While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
(Beaucoup de lignes en trop, mais comme on est dans la section débutant, autant montrer une manière propre de coder)

Maintenant, ce programme ne fait que lister les imprimantes installées. Tu ne peux pas (à ma connaissance) changer d'imprimante via PB sans passer par le PrintRequester().

La seule alternative serait de changer l'imprimante par défaut niveau Windows puis utiliser DefaultPrinter()
Même méthode RunProgram() mais avec

Code : Tout sélectionner

RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "nom_imprimante"
:wink:

Re: Détecter et sélectionner une imprimante

Publié : ven. 29/sept./2017 17:27
par falsam
Ou l'API WriteProfileString_()

Code : Tout sélectionner

EnableExplicit

Enumeration    
  #Win
  #Rpt
  #Print
EndEnumeration

Declare SetPrinter()
Declare PrintJob()

SetGadgetFont(#PB_Any, FontID(LoadFont(#PB_Any, "Verdana", 8)))

OpenWindow(#Win, 0, 0, 500, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(#Rpt, 5, 5, WindowWidth(#win) - 10, WindowHeight(#Win) - 100)

ButtonGadget(#Print, 5, WindowHeight(#Win) - 50, 100, 22, "Print")

Define Run = RunProgram("wmic", "printer get name", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)

If Run 
  While ProgramRunning(Run)
    If AvailableProgramOutput(Run)
      AddGadgetItem(#Rpt, -1, ReadProgramString(Run))
    EndIf
  Wend
  CloseProgram(Run)
  RemoveGadgetItem(#Rpt, 0) ; (enlever la première ligne de titre 'name')
Else
  AddGadgetItem(#Rpt, -1, "Erreur")
EndIf

BindGadgetEvent(#Rpt, @SetPrinter())
BindGadgetEvent(#Print, @PrintJob())

While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend

Procedure SetPrinter()
  Protected SelectPrinter.s = Trim(GetGadgetItemText(#Rpt, GetGadgetState(#Rpt)))
  
  Debug "Imprimante par defaut " + SelectPrinter
  WriteProfileString_("windows", "Device", SelectPrinter)
EndProcedure

Procedure PrintJob()
  LoadFont(0, "Arial", 100)
  
  ;lance l'impression sur l'imprimante par defaut
  If DefaultPrinter()  
    ;Prépare la page à imprimer
    If StartPrinting("Test d'impression") ;Nom du job qui apparaitra dans la file d'attente
      If StartDrawing(PrinterOutput())
        BackColor(RGB(255, 255, 255)) 
        FrontColor(RGB(0, 0, 0))      
        DrawingFont(FontID(0))
        DrawText(100, 300, "Quelle belle ligne d'impression")
        StopDrawing()
      EndIf
      StopPrinting()
    Else
      Debug "Oops : On imprime pas "
    EndIf  
  EndIf
EndProcedure
Il n'est pas obligatoire de choisir l'imprimante. L'impression se fera sur l'imprimante par défaut.

Re: Détecter et sélectionner une imprimante

Publié : ven. 29/sept./2017 19:59
par omega
Merci à vous deux (Falsam et Marc56)

Je vais tester

Re: Détecter et sélectionner une imprimante

Publié : dim. 01/oct./2017 21:43
par omega
Bonsoir

J'ai testé avec succès le 1er code proposé par Marc56. Il me donne la liste des imprimantes connectés. Merci beaucoup pour le code.
Il reste une petite chose: maintenant que j'ai choisi mon imprimante et je connais son nom (imp$), comment rendre cette imprimante par default?

Merci

Re: Détecter et sélectionner une imprimante

Publié : dim. 01/oct./2017 23:18
par falsam
Omega a écrit :maintenant que j'ai choisi mon imprimante et je connais son nom (imp$), comment rendre cette imprimante par default?
Teste mon code précédent et tu sauras. !!

Avec ce code j'ai pu faire des impressions sur 3 imprimantes différentes.