Winapi Druckrequester mit Druckervorwahl

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
michstro
Beiträge: 16
Registriert: 06.02.2011 16:42

Winapi Druckrequester mit Druckervorwahl

Beitrag 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
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Winapi Druckrequester mit Druckervorwahl

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
michstro
Beiträge: 16
Registriert: 06.02.2011 16:42

Re: Winapi Druckrequester mit Druckervorwahl

Beitrag 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
Antworten