Jump to content

Recommended Posts

Posted

any ideas on how i can get the temporary file passed into and through the print dialog (dialogue) to determine which printer should print the job?

Posted (edited)

I suppose you could use the WMI Win32_Printer to list the printers in a GUI combo box, then set this printer as default, using rundll32.exe or use directly the printui.dll.  Never tested it but I suppose it is doable.

Edit Couldn't help to test it, and I finally found a way to do everything within WMI.  There is a method for Win32_Printer that allow to set the default printer.  You would still need to create a GUI combo box for the user to select which printer to use, but you won't need to run the .exe or use .dll.  You can also retrieve the current default printer and revert back to it at script end. 

So bottom line, using _FilePrint would work nicely with WMI without the _WinAPI_PrintDlg.

Edited by Nine
Posted

i guess designing a gui with a combo box and a print and cancel button should be no big problem, i personally would not even care if i can not adjust the numbers of copies to be printed, etc because my goal would be achieved if i can print from the script with _FilePrint() and have a choice which printer to use. But it sounds complicated. especially if i look at the microsoft doc pages:

Win32_Printer class and Retrieving a WMI Class

i dare not ask, but how did you do it? or: where do i have to start?

 

Posted (edited)
  On 4/27/2019 at 5:14 PM, roeselpi said:

But it sounds complicated. especially if i look at the microsoft doc pages

Expand  

Nah, it is kind of easy once you know how to do it.  If you google autoit wmi, you will have a lot of examples using the query method.  So I'll let you search for that approach, but I will give you a different method, so you could compare which one you prefer.  So here what I would use :

Local $objWMI = ObjGet ('Winmgmts:\\' & @ComputerName & '\root\CIMV2')
If Not IsObj($objWMI) Then Exit MsgBox ($MB_SYSTEMMODAL,"Error","Winmgmts unavailable")
Local $oPrinters = $objWMI.InstancesOf("Win32_Printer")
If Not $oPrinters.count Then Exit MsgBox ($MB_SYSTEMMODAL,"Error","No printer defined")
Local $oCurrentDefaultPrinter
For $oPrn in $oPrinters
  MsgBox ($MB_SYSTEMMODAL,"",$oPrn.DeviceId)
  If $oPrn.Default Then $oCurrentDefaultPrinter = $oPrn
  If $oPrn.DeviceId = "Fax" Then $oPrn.SetDefaultPrinter ()
Next

You will need to grab the deviceId for each printer so that you can put that in the combobox.  My example sets the fax as the default printer and it also grab the current default printer so you revert it back to it at end of the script.  I also suggest you put the value of $oPrn along with the deviceid into a 2D array so you can refer to the object and its name easily afterward.

Enjoy !

Edited by Nine
Posted

hi,

i did many tests, i can not seem to find a solution for your aproach above, i tried this minor change:

Local $objWMI = ObjGet ('Winmgmts:\\' & @ComputerName & '\root\CIMV2')
If Not IsObj($objWMI) Then Exit MsgBox ($MB_SYSTEMMODAL,"Error","Winmgmts unavailable")
Local $oPrinters = $objWMI.InstancesOf("Win32_Printer")
If Not $oPrinters.count Then MsgBox ($MB_SYSTEMMODAL,"Error","No printer defined")
Local $oCurrentDefaultPrinter
For $oPrn in $oPrinters
    Global $printers[10][3] = [[$oPrinters.count,$oPrn.DeviceId,$oPrn.Default]]
  ;MsgBox ($MB_SYSTEMMODAL,"",$oPrn.DeviceId)
  If $oPrn.DeviceId = "PDF24 PDF" Then $oPrn.SetDefaultPrinter ()
  If $oPrn.Default Then $oCurrentDefaultPrinter = $oPrn
Next

_ArrayDisplay($printers)

basically exchanging the messagebox for an array but somehow it does not work like i thought it would. it only always enteres the last printer, but then i started looking at an older thread/topic with a printer realated manager and stumbled accross the code from within printmanager.au3 that would do the job for me. i took the segment that i required and used it to populate the ComboBox:

$printersarray = GetPrinters()
_ArrayDisplay($printersarray)

$hwnd=GUICreate("Print...",300,200)
$combo=GUICtrlCreateCombo("Select your desired Printer",50,20)
$print=GUICtrlCreateButton("PRINT", 20,150,120,30)
$cancel=GUICtrlCreateButton("CANCEL", 160,150,120,30)
For $i=1 To Ubound($printersarray)-1
    GUICtrlSetData($combo,$printersarray[$i])
Next

GUISetState()

Do
    $msg=GUIGetMsg()
Until $msg=-3

Func GetPrinters($sPrinterName = "")
    Local $aRet[10], $sFilter, $iCount = 0
    Local Const $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20
    If $sPrinterName <> "" Then $sFilter = StringReplace(" Where Name like '" & $sPrinterName & "'", "*", "%")
    Local $oWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    If NOT IsObj($oWMIService) Then Return SetError(1, 0, 0)
    Local $oPrinters = $oWMIService.ExecQuery ("Select * from Win32_Printer" & $sFilter, "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If NOT IsObj($oPrinters) Then Return SetError(1, 0, 0)
    For $oPrinter in $oPrinters
        $iCount += 1
        If $iCount >= UBound($aRet) Then ReDim $aRet[UBound($aRet) * 2]
        $aRet[$iCount] = $oPrinter.Name
    Next
    Redim $aRet[$iCount + 1]
    $aRet[0] = $iCount
    Return $aRet
EndFunc ; ==> GetPrinters

that more or less does what it is supposed to but now my question would be: how do i define a 'Case' for an unknown number of values from the ComboBox? I have six printers but you may only have 2 and fred,paul,or whoever might have 10 or more printers.

each option in the ComboBox must be able to pass the right command to a created Case in order for the printer to set the default differently and print the file to the desired printer with _FilePrint(). The trouble would be that every printer on every different computer would have a different name/id and therefore all factors are unknown and that makes it kind of difficult again. 

sure i can read the data from the $printerarray or even from the ComboBox but that does not help me somehow, or am i missing something?

Posted

....Maybe RTFPrinter ?....

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

Posted
  On 5/1/2019 at 12:52 PM, roeselpi said:

but somehow it does not work like i thought it would. it only always enteres the last printer

Expand  

The problem with your code is that you redefine the array at each loop, so it is normal that you get only the last printer.  You should have declare the array OUTSIDE the loop and use a counter like you did in the second code. I gave you all the pieces of the puzzle but it is not the final script, it was just an example that needs you to rework.  As for an example, the .SetDefaultPrinter () should be done AFTER the combo box selection.  Keep in mind that you will need to grab, in the array, the value of the objects ($oPrn) so you can execute the .SetDefaultPrinter () method when times come.

Only thing left now is to assemble the puzzle properly to fit your expectations. 

Happy scripting !

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...