Seite 1 von 1

Winapi Druckrequester mit Druckervorwahl

Verfasst: 17.11.2016 20:45
von michstro
Hallo zusammen,
wie kriege ich es hin bei der Winfunktion PrintDlg_(PrintDlg) dort einen speziellen Drucker vorzuwählen?
Hier bei dem Listing wählt er ja immer den Standartdrucker.
Ok ich könnte vor dem Requester dem SetDefaultPrinter() den Standart umbiegen, will den aber eigentlich nicht umstellen und dachte vielleicht kann man das dem Dialog irgendwie vorgeben.

Code: Alles auswählen

Prototype.s GetDefaultPrinter(Printer.s, *buffer)
Prototype.i SetDefaultPrinter(Printer.p-unicode)
Global Default_Printer.s

Procedure.s GetDefaultPrinter()
  Protected DLL.i = OpenLibrary(#PB_Any, "winspool.drv")
  Protected _GetDefaultPrinter.GetDefaultPrinter
  Protected Size.i, Result.s
 
  If DLL
    CompilerIf #PB_Compiler_Unicode
      _GetDefaultPrinter = GetFunction(DLL, "GetDefaultPrinterW")
    CompilerElse
      _GetDefaultPrinter = GetFunction(DLL, "GetDefaultPrinterA")
    CompilerEndIf
   
    If _GetDefaultPrinter
      _GetDefaultPrinter(#Null$, @Size)
      If Size
        Result = Space(Size)
        _GetDefaultPrinter(Result, @Size)
      EndIf
    EndIf
    CloseLibrary(DLL)
  EndIf
 
  ProcedureReturn Result
EndProcedure

Procedure.i SetDefaultPrinter(Printer.s)
  Protected DLL.i = OpenLibrary(#PB_Any, "winspool.drv")
  Protected _SetDefaultPrinter.Setdefaultprinter
  Protected Result.i
 
  If DLL
    _SetDefaultPrinter = GetFunction(DLL, "SetDefaultPrinterW")
    If _SetDefaultPrinter
      Result = _SetDefaultPrinter(Printer)
    EndIf
    CloseLibrary(DLL)
  EndIf
 
  ProcedureReturn Result
EndProcedure

Procedure Drucker_Standart() 
PrintDlg.PRINTDLG
PrintDlg\hDevMode = 0
PrintDlg\hDevNames = 0
PrintDlg\lStructSize = SizeOf(PRINTDLG)
PrintDlg\Flags = #PD_ALLPAGES | #PD_NOPAGENUMS | #PD_PRINTSETUP | #PD_USEDEVMODECOPIES | #PD_HIDEPRINTTOFILE | #PD_SELECTION
If PrintDlg_(PrintDlg) <> #False
  *DEVNAMES.DEVNAMES = GlobalLock_(PrintDlg\hDevNames)
  Default_Printer=PeekS(*DEVNAMES + *DEVNAMES\wDeviceOffset * SizeOf(Character))
  GlobalUnlock_(PrintDlg\hDevNames)
  tmp_drucker.s=GetDefaultPrinter()
  SetDefaultPrinter(Default_Printer)
  PrinterDC.L = DefaultPrinter()
  If PrinterDC
    Default_Printer_Width=PrinterPageWidth()
    Default_Printer_Height=PrinterPageHeight()
  EndIf
  SetDefaultPrinter(tmp_drucker)  
  EndIf
 EndProcedure
 
 For i= 1 To 2
   Drucker_Standart()
 Next
Vielen Dank im Vorraus
Mikk

Re: Winapi Druckrequester mit Druckervorwahl

Verfasst: 21.11.2016 18:10
von hjbremer
rundll32.exe printui.dll,PrintUIEntry /y /n <Druckername>

jeweils vor und nach dem Drucken mit dem gewünschten Drucker aufrufen

siehe https://de.wikipedia.org/wiki/Rundll32.exe

Re: Winapi Druckrequester mit Druckervorwahl

Verfasst: 18.12.2016 13:26
von michstro
Hallo,
habe viel zu spät gesehen das jemand geantwortet hat, vielen Dank für den Tip, in Purebasic habe ich das so umgesetzt

Code: Alles auswählen

RunProgram("rundll32.exe","printui.dll,PrintUIEntry /y /n "+Chr(34)+Default_Printer+Chr(34),"\",#PB_Program_Wait)
Mikk