Changing Windows default printer
By Sergey - Posted on January 1st, 2008
Sometimes it's necessary to change Windows default printer from within VFP application. It can be done with WIN API, WSH or WMI.
The SetDefaultPrinter WIN API function is available in Windows 2000 and later.
The SetDefaultPrinter WSH method is supported under Win98 and later but WSH has to be present on PC.
The SetDefaultPrinter WMI class method is available in Windows XP and later.
The WinApiErrMsg function in the code below is from Retrieving Windows system error message.
| This is sample code. Add error handling and adjust to your requirements as necessary. |
&& New default printer lcPrinterName = "Microsoft XPS Document Writer" && Save current Windows default printer in case we would want to restore it later lcSaveWinDefPrinter = SET("PRINTER", 2) &&------------------------------------------ && Windows API DECLARE Long GetLastError IN WIN32API DECLARE Long SetDefaultPrinter In WINSPOOL.DRV String pPrinterName IF SetDefaultPrinter(lcPrinterName) = 0 && Error ? WinApiErrMsg(GetLastError()) ELSE ? "New default printer: " + SET("PRINTER", 2) && ... && Restore default printer SetDefaultPrinter(lcSaveWinDefPrinter) ? "Restored default printer: " + SET("PRINTER", 2) ENDIF &&------------------------------------------ && WSH loNet = CREATEOBJECT("WScript.Network") TRY loNet.SetDefaultPrinter(lcPrinterName + "") ? "New default printer: " + SET("PRINTER", 2) &&... loNet.SetDefaultPrinter(lcSaveWinDefPrinter) ? "Restored default printer: " + SET("PRINTER", 2) CATCH TO oExp WHEN oExp.ErrorNo = 1429 && Error ? oExp.ErrorNo, oExp.Message ENDTRY &&------------------------------------------ && WMI loLocator = CREATEOBJECT('WBEMScripting.SWBEMLocator') && Local computer, logged on user loWMI = loLocator.ConnectServer() loWMI.Security_.ImpersonationLevel = 3 && Impersonate && Retrieve info about new printer loPrinters = loWMI.ExecQuery([Select * from Win32_Printer Where Name = '] + lcPrinterName + [']) && Check if new printer exists IF loPrinters.Count > 0 && FOR EACH loop is only way to access collection item(s) FOR EACH loPrinter IN loPrinters loPrinter.SetDefaultPrinter() ENDFOR ? "New default printer: " + SET("PRINTER", 2) &&... loPrinters = loWMI.ExecQuery([Select * from Win32_Printer Where Name = '] + lcSaveWinDefPrinter + [']) FOR EACH loPrinter IN loPrinters loPrinter.SetDefaultPrinter() ENDFOR ? "Restored default printer: " + SET("PRINTER", 2) ENDIF
Recent comments
1 week 22 hours ago
2 weeks 1 day ago
3 weeks 1 day ago
3 weeks 3 days ago
3 weeks 5 days ago
3 weeks 6 days ago
4 weeks 3 days ago
4 weeks 4 days ago
4 weeks 5 days ago
4 weeks 5 days ago