onefish Posted August 18, 2005 Share Posted August 18, 2005 (edited) My project was cruising along well until I just discovered a bug in the database software that automatically reverts to the default windows printer no matter what you tell it to do. The third party fix is $1000 for a redistribution lisence. Basically I am printing from the database to a virtual printer and Ghostscript which saves with a static directory/name. The database then initiates an AutoIT.exe that renames the PDF, moves & resizes the window. The PDF is used as a print preview with the option to save as if the file should be kept, print or just close. A script runs upon closing the database that deletes all *.pdf documents in the folder printed to. The distiller cannot be the default printer. A suitable workaround would be to script changing the default printer for the duration of the process. Can AutoIT do this? Edited August 18, 2005 by onefish Link to comment Share on other sites More sharing options...
SumTingWong Posted August 18, 2005 Share Posted August 18, 2005 (edited) Can AutoIT do this?<{POST_SNAPBACK}>RunWait(@SystemDir & '\RunDLL32.EXE printui.dll,PrintUIEntry /y /n "[Printer Display Name]"')or if you really want to show off:DllCall("printui.dll", "none", "PrintUIEntryW", _ "hwnd", 0, _ "ptr", 0, _ "wstr", '/y /n "' & $sPrinterName & '"', _ "int", @SW_SHOWNORMAL) Edited August 18, 2005 by SumTingWong Link to comment Share on other sites More sharing options...
ReFran Posted August 18, 2005 Share Posted August 18, 2005 If you print via Acrobat or Reader you can use the command-line option to specify a printer. That's much more easyer. HTH, Reinhard Link to comment Share on other sites More sharing options...
onefish Posted August 18, 2005 Author Share Posted August 18, 2005 Wow, I have got alot to learn. As it turns out (I think from observing the behavior) the database application loads it's settings to the default printer when it is launched. I believe I need to write a script that will change the default printer to the distiller then launch the database application, wait for a few seconds for it to load, then change the default printer back to the original one. Launching the database.exe is the only part of this that I have a grasp of at the moment. I would like to understand these scripts a bit better so I can: -declare a variable for the original default printer. I assume it would have to come from a DllCall but I do not understand the nature of the params and types. Do you know of a source for this information? -declare a variable for the distiller (I can work this one out) -use one of the scripts above to perform the first change -then revert. I am very keen to learn these things and I really appreciate your assistance. Thank you. Link to comment Share on other sites More sharing options...
ReFran Posted August 18, 2005 Share Posted August 18, 2005 (edited) -declare a variable for the original default printer. I assume it would have to come from a DllCall but I do not understand the nature of the params and types. Do you know of a source for this information?<{POST_SNAPBACK}>You can read the Default Printer from the registry.sRegKey = "HKCU\Software\Microsoft\Windows Nt\CurrentVersion\Windows\Device"HTH, Reinhard Edited August 18, 2005 by ReFran Link to comment Share on other sites More sharing options...
onefish Posted August 18, 2005 Author Share Posted August 18, 2005 Reinhard, So is this bit of script correct? Will this actually change the default printer through the "RunWait" command? $default = RegRead("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Nt\CurrentVersion\Windows\Device" , "DefaultPrinter") $distiller = "PDFCreator" RunWait(@SystemDir & "\RunDLL32.EXE printui.dll,PrintUIEntry /y /n " & $distiller ) ;Script that will launch the database application and pause for 5 seconds or so. RunWait(@SystemDir & "\RunDLL32.EXE printui.dll,PrintUIEntry /y /n " & $default ) I am unsure about the value I should be reading from the registry (DefaultPrinter). Your code also used "sRegKey", I am unsure where to use this parameter. Thank you for your assistance. Link to comment Share on other sites More sharing options...
onefish Posted August 19, 2005 Author Share Posted August 19, 2005 Any more help?? This is temporarily driving me mad. Everything works in a 4 month long project except changing the default printer while the database application is executed. Link to comment Share on other sites More sharing options...
ReFran Posted August 19, 2005 Share Posted August 19, 2005 (edited) Any more help?? This is temporarily driving me mad. Everything works in a 4 month long project except changing the default printer while the database application is executed.<{POST_SNAPBACK}>A little bit testing would help.The RegKey is HKCU instead of HKLM (sorry). The Code snipet is from VBS. Here how to get it with Autoit - at least under Win2k.$default = RegRead("HKCU\Software\Microsoft\Windows Nt\CurrentVersion\Windows", "Device")MsgBox("","Test",$default)I think to use $default with RunDll32, you have to shorten it to only the printer name.HTH, Reinhard Edited August 19, 2005 by ReFran Link to comment Share on other sites More sharing options...
onefish Posted August 19, 2005 Author Share Posted August 19, 2005 (edited) OK, I have mucked around and can change the default printer in the registry easy enough. This is the first time I have mucked around with registry settings and I was a bit hesitant. My script is working on 2k and XP. Any traps I should be aware of post 95 with HKCU printer settings? Test script: $default = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows Nt\CurrentVersion\Windows", "Device") $new = "PDFCreator," & RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows Nt\CurrentVersion\Devices", "PDFCreator") RegWrite( "HKEY_CURRENT_USER\Software\Microsoft\Windows Nt\CurrentVersion\Windows", "Device" , "REG_SZ" , $new ) MsgBox(0, "YES/N0", $default & @CR & $new & @CR & @error) RegWrite( "HKEY_CURRENT_USER\Software\Microsoft\Windows Nt\CurrentVersion\Windows", "Device" , "REG_SZ" , $default ) This changes the default printer and then reverts back after the MsgBox. I will put some error captures in before using in real world. Edited August 19, 2005 by onefish Link to comment Share on other sites More sharing options...
fhanna Posted March 10, 2007 Share Posted March 10, 2007 The earlier post of RunWait(@SystemDir & '\RunDLL32.EXE printui.dll,PrintUIEntry /y /n "[Printer Display Name]"') is great. I had a need for this to change default printer during execution. Was using kixtart to add/delete default printer. I can use the mentioned to add/change default but how do I check to see if it exist. I have a text file of printers and upon loading want to check to see if printer exist and if not add it. I cannot find appropriate code to determine if printer exist. Secondly, if I attempt to add a printer and the printer name is invalid Autoit3 will not return an error code. I get a Printers dialog box stating Operation could not be completed. Either the printer name was typed incorrectly, or the specified printer has lost it's connection to the server. Bottom line: Upon script startup want to check if printer exist, if not add printer but be able to check if successful. Printer name will be supplied via a file and thus check to insure valid name. Thank you Link to comment Share on other sites More sharing options...
ReFran Posted May 23, 2007 Share Posted May 23, 2007 (edited) Just saw this and just worked with printers. Took the following code and change it to your need. HTH, Reinhard ;----------------------------------------------------------- ; Get specific information from all installed printers ; Refran based on a VBS from Christoph Basedau ;----------------------------------------------------------- $oWMI = ObjGet("winmgmts:") GetPrinter ("Win32_Printer") Func GetPrinter($sID) $colWBEMSet = $oWMI.InstancesOf($sID) msgbox(0,"",$colWBEMSet.count) If $colWBEMSet.count = 0 Then MsgBox(0,"", "No elements in Win32_Printer found") exit Else For $oElem in $colWBEMSet $xFind = "" $xtxt = $oElem.GetObjectText_ ;msgbox(0,"",$xTxt);= show all information $aTxt = Stringsplit($xTxt,";") for $x in $atxt; Filter specific information if stringInstr(stringleft($x,9),"Name = ") then $xfind = $xfind &$x &"; " if stringInstr($x,"DriverName = ") then $xfind = $xFind &$x &"; " if stringInstr($x,"PortName = ") then $xfind = $xFind &$x &"; " if stringInstr($xfind,"PortName") then exitLoop;=PortName = last to find next msgbox(0,"",$xFind) Next EndIf EndFunc Edited May 23, 2007 by ReFran SupaNewb 1 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now