c# - scanner - no aparece escaner en windows 10
¿Cómo puedo obtener el nombre de la impresora del dispositivo e impresoras IShellFolder? (2)
Obtengo íconos de impresoras del sistema que usan código (solo la forma que encontré - es usar IShellFolder), ahora quiero conectarlos con InstalledPrinters, pero el problema es que no encuentro la forma de encontrar el nombre real de la impresora (como "/ ServerName / PrinterName "), con es diferente para mostrar el nombre del contenido de la carpeta del shell" Dispositivos e impresoras "y solo es correcto para usar con PrinterSettings.
El código que uso para recuperar iconos de impresora y títulos de impresora en la carpeta de shell "Dispositivos e impresoras":
Shell32.IShellFolder iDesktopFolder = Shell32.GetDesktopFolder();
try
{
IntPtr pidlPrintersFolder;
if (Shell32.SHGetFolderLocation(_hwndOwner, (int)Shell32.CSIDL.CSIDL_PRINTERS, IntPtr.Zero, 0, out pidlPrintersFolder) == 0)
try
{
StringBuilder strDisplay = new StringBuilder(260);
Guid guidIShellFolder = Shell32.IID_IShellFolder;
IntPtr ptrPrintersShellFolder;
iDesktopFolder.BindToObject(pidlPrintersFolder, IntPtr.Zero, ref guidIShellFolder, out ptrPrintersShellFolder);
Object objPrintersShellFolder = Marshal.GetTypedObjectForIUnknown(ptrPrintersShellFolder, Shell32.ShellFolderType);
try
{
Shell32.IShellFolder printersShellFolder = (Shell32.IShellFolder)objPrintersShellFolder;
IntPtr ptrObjectsList;
printersShellFolder.EnumObjects(_hwndOwner, Shell32.ESHCONTF.SHCONTF_NONFOLDERS, out ptrObjectsList);
Object objEnumIDList = Marshal.GetTypedObjectForIUnknown(ptrObjectsList, Shell32.EnumIDListType);
try
{
Shell32.IEnumIDList iEnumIDList = (Shell32.IEnumIDList)objEnumIDList;
IntPtr[] rgelt = new IntPtr[1];
IntPtr pidlPrinter;
int pceltFetched;
Shell32.STRRET ptrString;
while (iEnumIDList.Next(1, rgelt, out pceltFetched) == 0 && pceltFetched == 1)
{
printersShellFolder.GetDisplayNameOf(rgelt[0],
Shell32.ESHGDN.SHGDN_NORMAL, out ptrString);
if (Shell32.StrRetToBuf(ref ptrString, rgelt[0], strDisplay,
(uint)strDisplay.Capacity) == 0)
{
pidlPrinter = Shell32.ILCombine(pidlPrintersFolder, rgelt[0]);
string printerDisplayName = strDisplay.ToString();
Shell32.SHFILEINFO shinfo = new Shell32.SHFILEINFO();
Shell32.SHGetFileInfo(this._pidl, 0, out shinfo, (uint)Marshal.SizeOf(shinfo), Shell32.SHGFI.PIDL | Shell32.SHGFI.AddOverlays | Shell32.SHGFI.Icon);
Icon printerIcon = (Icon)Icon.FromHandle(shinfo.hIcon).Clone();
Shell32.DestroyIcon(shinfo.hIcon);
// HOW TO GET PRINTER NAME (//ServerName/printername) WITH IS DIFFERENT FROM A PRINTER NAME IN "DEVICES AND PRINTERS" SYSTEM FOLDER
}
}
}
finally
{
Marshal.ReleaseComObject(objEnumIDList);
}
}
finally
{
Marshal.ReleaseComObject(objPrintersShellFolder);
}
}
finally
{
Shell32.ILFree(pidlPrintersFolder);
}
}
finally
{
Marshal.ReleaseComObject(iDesktopFolder);
}
Gracias por cualquier ayuda.
Encuentra la respuesta por mi cuenta.
Para enumerar impresoras en IShellFolder, debemos usar el método IShellFolder.ParseDisplayName, no EnumObjects, y enviar el nombre de la impresora desde PrinterSettings.IntalledPrinters (como "/ ServerName / PrinterName" para impresoras de red) a IShellFolder.ParseDisplayName param pszDisplayName, IShellFolder "Devices and printers" trabaja bien con esto
Entonces, después de esto, podemos enumerar los nombres reales de las impresoras ("/ ServerName / PrinterName"), los nombres de las impresoras ("PrinterName on ServerName" como impresoras enumeradas en "Dispositivos e impresoras") y los iconos de la impresora.
Publicaré el código completo aquí para la búsqueda del padre después de algunas ediciones.
En el ciclo, puede usar printersShellFolder.GetUIObjectOf
para IID_IDataObject
en IID_IDataObject
actual rgelt[0]
y llamar a IDataObject::GetData
con "PrinterFriendlyName"
como formato de portapapeles para obtener el nombre real de la impresora (codificado en STGMEDIUM
).
Puede usar printersShellFolder.GetUIObjectOf
para IID_IQueryInfo
en el pidl actual para obtener también el estado de la impresora.