Imprimer direct sans choisir l'imprimante

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Cubitus98
Messages : 11
Inscription : lun. 26/déc./2022 14:34

Imprimer direct sans choisir l'imprimante

Message par Cubitus98 »

Voila dans le titre, y a tout.

Je ne désire pas devoir choisir l'imprimante, je connais son nom et désire tout envoyer avec juste un "open print" (terme arbitraire que j'ai choisi" et envoyer les données, sachant que c'est que du text ^^.

On peux faire ou pas ?

Merci a vous ^^
Avatar de l’utilisateur
Mindphazer
Messages : 693
Inscription : mer. 24/août/2005 10:42

Re: Imprimer direct sans choisir l'imprimante

Message par Mindphazer »

Peut-être ici ? :
https://www.purebasic.fr/english/viewto ... 82#p519982

(pas testé, je suis pas sous Windows à la maison)
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Cubitus98
Messages : 11
Inscription : lun. 26/déc./2022 14:34

Re: Imprimer direct sans choisir l'imprimante

Message par Cubitus98 »

Ca semblerait bien être ça, mais j'ai ce message d'erreur :

[21 :48 :53] [ERREUR] Accès mémoire invalide. (erreur de lecture à l'adresse 18446744071637306972)

Mais merci m'en même ;)
Avatar de l’utilisateur
Mindphazer
Messages : 693
Inscription : mer. 24/août/2005 10:42

Re: Imprimer direct sans choisir l'imprimante

Message par Mindphazer »

Sinon tu peux essayer ça :
https://www.purebasic.fr/english/viewtopic.php?t=77057

(toujours pas testé bien sûr)
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Imprimer direct sans choisir l'imprimante

Message par case »

pourtant bien décrit dans la doc...

Code : Tout sélectionner

  Resultat = DefaultPrinter()
  If Resultat <> 0
    If StartPrinting("") 
      ; les trucs a imprimer se mettent ici 
      StopPrinting()
      EndIf
  Else
    MessageRequester("Info","Pas d'imprimante par défaut.") 
  EndIf
ImageImage
Cubitus98
Messages : 11
Inscription : lun. 26/déc./2022 14:34

Re: Imprimer direct sans choisir l'imprimante

Message par Cubitus98 »

@case

Non tu utilise l'imprimante par défaut.

Ce que je cherche, c'est outrepassé l'imprimante et de donner le nom de l'imprimante à laquelle je veux imprimer.

Ex: Par défaut j'ai ma laser et je désire imprimer sur mon imprimante ticket " non de l'imprimant" et lancer sans devoir la choisir. :)

les exemple au-dessus ne fonctionne m'malheureusement pas :?
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Imprimer direct sans choisir l'imprimante

Message par falsam »

Petite question. Tu envoies ton ticket ligne par ligne vers l'imprimante ou envoies tu un fichier texte dans un seul flux ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Imprimer direct sans choisir l'imprimante

Message par falsam »

Petit code Windows uniquement : Imprimer sur une imprimante qui peut ne pas être celle par défaut.
Pour mon test, j'imprime sur une imprimante PDF

1 Mémoriser le nom de l'imprimante par défaut
2 Définir une nouvelle imprimante avec son nom windows
3 Lancer l'impression
4 Redéfinir l'imprimante par défaut initial.

Code : Tout sélectionner

EnableExplicit

; OBtenir le nom de l'imprimante par défaut
Procedure.s GetDefaultPrinter()
  Protected name.s = Space(255)
  GetProfileString_("Windows","Device", "", @name, 255)
  ProcedureReturn StringField(name,1,",")
EndProcedure

; Sélectionner une imprimante (API)
Procedure SetPrinter(Name.s)  
  WriteProfileString_("windows", "Device", Name)
EndProcedure


; Pour l'exemple, test d'impression dans un fichier PDF

; Mémoriser l'imprimante par défaut
Define DefaultPrinter.s = GetDefaultPrinter()

; Définir une nouvelle imprimante par défaut
SetPrinter("Microsoft Print To PDF")

; Lance l'impression sur l'imprimante selectionné
If DefaultPrinter()  
  ; Nom du job qui apparaitra dans la file d'attente
  If StartPrinting("Test d'impression")
    
    ;Prépare la page à imprimer
    LoadFont(0, "Arial", 100)

    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 : Souci d'impression. Vérifier le nom de l'imprimante"
  EndIf  
EndIf

; Ne pas oublier de revenir à l'ancien nom d'imprimante par défaut
SetPrinter(DefaultPrinter)[/code]
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Imprimer direct sans choisir l'imprimante

Message par falsam »

Un autre code basé sur le précèdent code pour Imprimer un fichier texte sur une imprimante qui peut ne pas être celle par défaut..

Code : Tout sélectionner

EnableExplicit

; Obtenir le nom de l'imprimante par défaut
Procedure.s GetDefaultPrinter()
  Protected name.s = Space(255)
  GetProfileString_("Windows","Device", "", @name, 255)
  ProcedureReturn StringField(name,1,",")
EndProcedure

; Sélectionner une imprimante
Procedure SetPrinter(Name.s)  
  WriteProfileString_("windows", "Device", Name)
EndProcedure


; Pour l'exemple, test d'impression dans un fichier PDF

; Mémoriser l'imprimante par défaut
Define DefaultPrinter.s = GetDefaultPrinter()
Define Format.i, CurrentLine.s, LineY.i, CountLine

; Définir une nouvelle imprimante par défaut
SetPrinter("Microsoft Print To PDF")

; Lance l'impression sur l'imprimante selectionné
If DefaultPrinter()  
  ; Nom du job qui apparaitra dans la file d'attente
  If StartPrinting("Test d'impression")
    
    ;Prépare la page à imprimer
    LoadFont(0, "Arial", 20)
    
    If StartDrawing(PrinterOutput())
      BackColor(RGB(255, 255, 255)) 
      FrontColor(RGB(0, 0, 0))      
      DrawingFont(FontID(0))
      
      If ReadFile(0, "c:\test.txt")
        ; Détection du format (UTF8, ASCII, Unicode)
        Format = ReadStringFormat(0)
        
        ; Lecture de chaque ligne du fichier texte
        While Eof(0) = 0
          CurrentLine = ReadString(0, Format)
          
          ; Ajouter un espace quand on rencontre une ligne vide
          If Len(CurrentLine) = 0
            CurrentLine = " "
          EndIf
          
          ; Dessiner la ligne
          DrawText(10, LineY, CurrentLine)
          
          ; Calculer l'emplacement Y de la ligne suivante
          LineY + TextHeight(CurrentLine)
        Wend
       
        CloseFile(0)                
        EndIf  
        StopDrawing()
      EndIf
      StopPrinting()
      
      Debug "Impression terminée"
    Else
      Debug "Oops : Souci d'impression. Vérifier le nom de l'imprimante"
    EndIf  
  EndIf
  
  ; Ne pas oublier de revenir à l'ancien nom d'imprimante par défaut
  SetPrinter(DefaultPrinter)[/code]
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Imprimer direct sans choisir l'imprimante

Message par Marc56 »

Merci Falsam pour ces exemples clairs comme d'habitude :P ça va aussi m'être utile.

J'avais trouvé sur le forum us un exemple (compliqué) qui listait toutes les imprimantes installées mais il était pour les anciennes version de PB en mode ascii donc donnait un affichage bizarre.

J'ai modifié le tien pour juste afficher l'imprimante par défaut et comprendre)
(Bizarrement, la première fois, sans StringField, ça n'affichait rien? (et pas de ',' dans ShowVariableViewer()) ?)

Code : Tout sélectionner

Printers_Names$ = Space(255)
GetProfileString_("Windows","Device", "", @Printers_Names$, 255)
Debug "Imprimante par défaut : " + Printers_Names$
(J'essaye maintenant de le modifier pour afficher toutes les imprimantes dans une ComboBox pour l'intégrer à un programme et que l'utilisateur puisse choisir directement (et garder cette imprimante dans ses prefs))
:wink:
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Imprimer direct sans choisir l'imprimante

Message par falsam »

Marc56 a écrit : mer. 26/févr./2025 9:34 (J'essaye maintenant de le modifier pour afficher toutes les imprimantes dans une ComboBox
J'ai un code qui t'appartient pour obtenir la liste de toutes les imprimantes

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
Tu peux récupérer l'imprimante choisi par l'utilisateur.
Marc56 a écrit : mer. 26/févr./2025 9:34 l'utilisateur puisse choisir directement (et garder cette imprimante dans ses prefs))
Avec cette procédure, l'imprimante sélectionnée deviendra l'imprimante par défaut.

Code : Tout sélectionner

Procedure SetPrinter(Name.s)  
  WriteProfileString_("windows", "Device", Name)
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Imprimer direct sans choisir l'imprimante

Message par Marc56 »

aaahhhh, "wmic" je l'avais oublié.
Merci
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Imprimer direct sans choisir l'imprimante

Message par venom »

wmic ne fonctionne plus normalement au dessus de windows 10 (21H1) ! Si ?






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Imprimer direct sans choisir l'imprimante

Message par falsam »

venom a écrit : sam. 01/mars/2025 14:09 wmic ne fonctionne plus normalement au dessus de windows 10 (21H1) !
Je suis en version 24H2 et wmic fonctionne encore ....
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Imprimer direct sans choisir l'imprimante

Message par falsam »

Lister les imprimantes installées avec PowerShell et la fonction Get-Printer

Code : Tout sélectionner

EnableExplicit

Enumeration    
  #Win
  #Rpt
EndEnumeration

Define Buffer.s

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("powershell.exe", "Get-Printer | Select-Object -Property Name", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)

If Run 
  While ProgramRunning(Run)
    If AvailableProgramOutput(Run)
      Buffer = ReadProgramString(Run)
      If Len(Trim(Buffer)) > 0
        AddGadgetItem(#Rpt, -1, Buffer)
      EndIf
    EndIf
  Wend
  CloseProgram(Run)
  
  ; Enlever entete de colonne
  RemoveGadgetItem(#Rpt, 0) : RemoveGadgetItem(#Rpt, 0) : RemoveGadgetItem(#Rpt, 0)  
Else
  AddGadgetItem(#Rpt, -1, "Erreur")
EndIf

While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend[/code]
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre