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 testenJayCool hat geschrieben: Ich hab' jetzt aber noch'n kleines Problem:
Ich würd' gerne einen x-beliebigen Drucker verwenden, und nicht den Default-Printer.

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
