Estoy creando una aplicación .Net 4.0 para el control remoto de un dispositivo de escáner. He probado las bibliotecas TWAIN y WIA, pero tengo el mismo problema. Escaneando imágenes sinselección del escáner y escaneando los cuadros de diálogo de configuración.Uso de un escáner sin cuadros de diálogo en C#
I conocer un artículo útil en WIA scripting in .Net, y modificar a esto:
private Image Scan(string deviceName)
{
WiaClass wiaManager = null; // WIA manager COM object
CollectionClass wiaDevs = null; // WIA devices collection COM object
ItemClass wiaRoot = null; // WIA root device COM object
CollectionClass wiaPics = null; // WIA collection COM object
ItemClass wiaItem = null; // WIA image COM object
try
{
// create COM instance of WIA manager
wiaManager = new WiaClass();
// call Wia.Devices to get all devices
wiaDevs = wiaManager.Devices as CollectionClass;
if ((wiaDevs == null) || (wiaDevs.Count == 0))
{
throw new Exception("No WIA devices found!");
}
object device = null;
foreach (IWiaDeviceInfo currentDevice in wiaManager.Devices)
{
if (currentDevice.Name == deviceName)
{
device = currentDevice;
break;
}
}
if (device == null)
{
throw new Exception
(
"Device with name \"" +
deviceName +
"\" could not be found."
);
}
// select device
wiaRoot = (ItemClass)wiaManager.Create(ref device);
// something went wrong
if (wiaRoot == null)
{
throw new Exception
(
"Could not initialize device \"" +
deviceName + "\"."
);
}
wiaPics = wiaRoot.GetItemsFromUI
(
WiaFlag.SingleImage,
WiaIntent.ImageTypeColor
) as CollectionClass;
if (wiaPics == null || wiaPics.Count == 0)
{
throw new Exception("Could not scan image.");
}
Image image = null;
// enumerate all the pictures the user selected
foreach (object wiaObj in wiaPics)
{
if (image == null)
{
wiaItem = (ItemClass)Marshal.CreateWrapperOfType
(
wiaObj, typeof(ItemClass)
);
// create temporary file for image
string tempFile = Path.GetTempFileName();
// transfer picture to our temporary file
wiaItem.Transfer(tempFile, false);
// create Image instance from file
image = Image.FromFile(tempFile);
}
// release enumerated COM object
Marshal.ReleaseComObject(wiaObj);
}
if (image == null)
{
throw new Exception("Error reading scanned image.");
}
return image;
}
finally
{
// release WIA image COM object
if (wiaItem != null)
Marshal.ReleaseComObject(wiaItem);
// release WIA collection COM object
if (wiaPics != null)
Marshal.ReleaseComObject(wiaPics);
// release WIA root device COM object
if (wiaRoot != null)
Marshal.ReleaseComObject(wiaRoot);
// release WIA devices collection COM object
if (wiaDevs != null)
Marshal.ReleaseComObject(wiaDevs);
// release WIA manager COM object
if (wiaManager != null)
Marshal.ReleaseComObject(wiaManager);
}
}
Con esta realidad logré para seleccionar el dispositivo a partir de (parámetro de entrada del método Scan) de configuración y recuperar la imagen resultante después de escanear.
Pero el problema con el diálogo de opciones de escaneo (Escanear usando DEVICENAME). Como se trata de una aplicación de control remoto, el diálogo no estará visible para el usuario, por lo que necesito omitirlo utilizando la configuración predeterminada, o usar las configuraciones de una configuración si es necesario. Opciones
Escaneo de diálogo:
¿Cree que quizás, si está intentando evitar que aparezca una IU, tener una llamada a 'GetItemsFromUI' podría ser la raíz de su problema? –
Por cierto, esto se hace usando _Microsoft Windows Image Acquisition 1.01 Type Library_, pero cualquier otra biblioteca es bienvenida si resuelve este problema. –
@Damien_The_Unbeliever: LOL, ese debe ser el problema, pero ¿cuál es la alternativa? –