Jump to content

printing without saving from an edit box


Recommended Posts

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
Link to comment
Share on other sites

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?

 

Link to comment
Share on other sites

58 minutes ago, roeselpi said:

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

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
Link to comment
Share on other sites

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?

Link to comment
Share on other sites

....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:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related:How to get reference to PDF object embeded in IE * IE on Windows 11

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Link to comment
Share on other sites

2 hours ago, roeselpi said:

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

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 !

Link to comment
Share on other sites

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
 Share

  • Recently Browsing   0 members

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