Will someone know if there is any way to list the printers on the client side? I was using system.drawing but it just lists me from the server.
Any suggestions?
Will someone know if there is any way to list the printers on the client side? I was using system.drawing but it just lists me from the server.
Any suggestions?
You can not access the resources of an ASP.NET client directly because of security issues. You will need to implement a ActiveX
control or use Silverlight
for it.
I show you an example of a control that I implemented years ago. (some steps I put text in English because this way I have my Visual Studio
set.
Project properties\Signing\Sign the assembly
. Project properties\Build\Output\Register for COM Interop
. Set postcompilation events (this is to test in your local) in Project properties\Build events\Post-build event command line
put
echo Un-register the components first
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "$(TargetDir)$(TargetFileName)" /tlb:ActiveXPrinter.tlb /codebase /u
echo Register the components
"C:\Windows\Microsoft.NET\Framework\v4.0.30319 \RegAsm.exe" "$(TargetDir)$(TargetFileName)" /tlb:ActiveXPrinter.tlb /codebase
echo All done
Now the code of your control.
using System;
using System.Linq;
using System.Management;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using Microsoft.Win32;
namespace ActiveXPrinter
{
[ProgId("ActiveXPrinter.PrinterHelper")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("C0167B9D-2987-331A-97F6-3BCEF78E041A")]
[ComVisible(true)]
public class PrinterHelper
{
#region Register/Unregister
[ComRegisterFunction()]
public static void RegisterClass(string key)
{
// Strip off HKEY_CLASSES_ROOT\ from the passed key as I don't need it
StringBuilder sb = new StringBuilder(key);
sb.Replace(@"HKEY_CLASSES_ROOT\", "");
// Open the CLSID\{guid} key for write access
RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
// And create the 'Control' key - this allows it to show up in
// the ActiveX control container
RegistryKey ctrl = k.CreateSubKey("Control");
ctrl.Close();
// Next create the CodeBase entry - needed if not string named and GACced.
RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
inprocServer32.Close();
// Finally close the main key
k.Close();
}
[ComUnregisterFunction()]
public static void UnregisterClass(string key)
{
StringBuilder sb = new StringBuilder(key);
sb.Replace(@"HKEY_CLASSES_ROOT\", "");
// Open HKCR\CLSID\{guid} for write access
RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
// Delete the 'Control' key, but don't throw an exception if it does not exist
k.DeleteSubKey("Control", false);
// Next open up InprocServer32
RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
// And delete the CodeBase key, again not throwing if missing
k.DeleteSubKey("CodeBase", false);
// Finally close the main key
k.Close();
}
#endregion
[ComVisible(true)]
public string Devuelve(string mensaje)
{
//Método "dummy" que devuelve la entrada. Vale para probar que el ActiveX está bien instalado
return mensaje;
}
[ComVisible(true)]
public string GetPrinters()
{
//Obtenemos las impresoras instaladas en el cliente
SelectQuery oSelectQuery = new SelectQuery { QueryString = "select * from win32_printer" };
ManagementObjectSearcher search = new ManagementObjectSearcher(oSelectQuery);
ManagementObjectCollection results = search.Get();
//Guardamos el nombre de la impresora que actualmente tiene por defecto el usuario
string impresoraOriginalPorDefecto = string.Empty;
foreach (ManagementObject printer in results)
{
impresoraOriginalPorDefecto += printer["Name"].ToString() + "|";
}
return impresoraOriginalPorDefecto;
}
[ComVisible(true)]
public string GetDefaultPrinter()
{
string salida = string.Empty;
//Obtenemos la impresora instaladas en el cliente que esté marcada como "por defecto"
SelectQuery oSelectQuery = new SelectQuery { QueryString = "select * from win32_printer where Default = True" };
ManagementObjectSearcher search = new ManagementObjectSearcher(oSelectQuery);
ManagementObjectCollection results = search.Get();
if (results.Count > 0)
{
salida = results.OfType<ManagementObject>().First()["Name"].ToString();
}
return salida;
}
[ComVisible(true)]
public Boolean SetDefaultPrinter(string printerName)
{
bool salida = false;
//Obtenemos las impresoras instaladas en el cliente con el nombre especificado
SelectQuery oSelectQuery = new SelectQuery { QueryString = "select * from win32_printer where Name = '"+ printerName + "'" };
ManagementObjectSearcher search = new ManagementObjectSearcher(oSelectQuery);
ManagementObjectCollection results = search.Get();
if (results.Count > 0)
{
results.OfType<ManagementObject>().First().InvokeMethod("SetDefaultPrinter", null);
salida = true;
}
return salida;
}
[ComVisible(true)]
public Boolean SetDefaultPrinterMask(string printerMask)
{
bool salida = false;
//Obtenemos las impresoras instaladas en el cliente
SelectQuery oSelectQuery = new SelectQuery { QueryString = "select * from win32_printer" };
ManagementObjectSearcher search = new ManagementObjectSearcher(oSelectQuery);
ManagementObjectCollection results = search.Get();
//Establecemos la impresora por defecto para imprimir
foreach (ManagementObject printer in results)
{
//Se encuentra la impresora con nombre que contenga lo que nos especifican y se pone por defecto
if (printer["Name"].ToString().ToUpper().Trim().Contains(printerMask.ToUpper()))
{
printer.InvokeMethod("SetDefaultPrinter", null);
salida = true;
break;
}
}
return salida;
}
}
}