Auflösung des Druckers abfragen? [gelöst]

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

JayCool hat geschrieben: Ich hab' jetzt aber noch'n kleines Problem:
Ich würd' gerne einen x-beliebigen Drucker verwenden, und nicht den Default-Printer.
Diese Lösung sollte auf allen Windows-Versionen ab Win95 funktionieren (erfolgreich getestet unter WinNT SP6 und WinXP SP2; vielleicht könnte es jemand auch einmal unter Vista testen :wink: ). Sie ermittelt die installierten Drucker und zeigt diese in einer ComboBox an. Nach Auswahl eines Druckers wird dessen aktuelle Auflösung angezeigt:

Code: Alles auswählen

EnableExplicit

NewList Printer.S()

Procedure.L GetInstalledPrinters()
  Shared Printer.S()

  Protected *Buffer
  Protected BufferSize.L
  Protected *Printer
  Protected PrinterName.S

  ClearList(Printer()) 

  BufferSize = 8192 
  *Buffer = AllocateMemory(BufferSize) 
  *Printer = *Buffer

  If GetProfileString_("Devices", 0, "", *Buffer, BufferSize)
    PrinterName = PeekS(*Printer)

    While Trim(PrinterName) <> ""
      AddElement(Printer())
      Printer() = Trim(PrinterName)
      *Printer = *Printer + Len(PrinterName) + 1
      PrinterName = PeekS(*Printer)
    Wend 
  EndIf 

  FreeMemory(*Buffer) 

  ProcedureReturn CountList(Printer()) 
EndProcedure 

Define DriverName.S
Define Info.S
Define WindowsVersion.L
Define PrinterDC.L
Define SelectedPrinter.S
Define WindowEvent.L

If OpenWindow(0, 0, 0, 160, 70, "Drucker-Auswahl", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(0))
    ComboBoxGadget(0, 10, 10, 140, 100)
    ButtonGadget(1, 20, 40, 120, 20, "Auflösung anzeigen")

    If GetInstalledPrinters() = 0
      End
    Else
      ForEach Printer()
        AddGadgetItem(0, -1, Printer())
      Next
    EndIf

    SetGadgetState(0, 0)

    Repeat
      WindowEvent = WaitWindowEvent()

      Select WindowEvent
        Case #PB_Event_CloseWindow
          End
        Case #PB_Event_Gadget
          If EventGadget() = 1
            If EventType() = #PB_EventType_LeftClick
              SelectedPrinter = GetGadgetText(0)
              Break
            EndIf
          EndIf
      EndSelect
    ForEver

    CloseWindow(0)

    WindowsVersion = OSVersion()
    
    If WindowsVersion <> #PB_OS_Windows_95 And WindowsVersion <> #PB_OS_Windows_98
      DriverName = "WinSpool"
    EndIf

    PrinterDC = CreateDC_(@"WinSpool", @SelectedPrinter, 0, 0)

    If PrinterDC
      Info = "Drucker: " + SelectedPrinter + #CR$ + #CR$
      Info + "Horizontale Auflösung = " + Str(GetDeviceCaps_(PrinterDC, #LOGPIXELSX)) + " DPI" + #CR$
      Info + "Vertikale Auflösung = " + Str(GetDeviceCaps_(PrinterDC, #LOGPIXELSY)) + " DPI"

      DeleteDC_(PrinterDC)

      MessageRequester("Drucker-Auflösung", Info, #MB_ICONINFORMATION)
    EndIf
  EndIf
EndIf
Update: Dieses Programm läuft ohne Änderung auch unter Win95A, Win95C, Win98SE und Win2000 Server. :allright:
Zuletzt geändert von Shardik am 24.01.2008 09:47, insgesamt 1-mal geändert.
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

Beitrag von JayCool »

Hi Shardik,

vielen Dank für Deine Bemühungen!
Ich hab' leider kein Vista, deshalb kann ich das Programm auch nicht dort testen.

Gruß, Jan
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag von PMTheQuick »

Auf Vista läufts ebenfalls perfekt! :allright:

---------------------------
Drucker-Auflösung
---------------------------
Drucker: EPSON Stylus DX7000F Series

Horizontale Auflösung = 360 DPI
Vertikale Auflösung = 360 DPI
---------------------------
OK
---------------------------


Gruss
PMTheQuick ;)
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

PMTheQuick,

Danke schön für den Vista-Test. Es ist schon erstaunlich, daß diese Methode der Druckerermittlung noch funktioniert.

Ich hatte nämlich schon einmal eine Diskussion mit ts-soft darüber, ob man überhaupt noch den Weg über das Auslesen von alten Ini-Systemdateien gehen sollte (die unter neueren Windows-Versionen mittlerweile per Mapping von Registry-Werten so virtualisiert werden, als wären sie noch in Dateiform vorhanden) oder ob man längeren Code mit unterschiedlichen Prozeduren für verschiedene Windows-Versionen erstellen sollte, die wahrscheinlich zukunftssicherer sind:
http://www.purebasic.fr/german/viewtopi ... 15&start=4

Dein Test demonstriert also, daß Microsoft auch bei Vista "alten Ballast" noch nicht über Bord geworfen hat... :twisted:
Antworten