Вы можете попытаться использовать API-интерфейс Windows Image Acquisition (WIA). WIA 2.0 был выпущен в Windows Vista и ориентирован в основном на сканеры. Он по-прежнему поддерживается для Windows 7. Я тестировал его с помощью сканера HP Scanjet 4670 некоторое время назад. Ваш сканер должен быть совместим с API WIA.
Чтобы получить доступ к WIA 2.0, вам необходимо добавить ссылку на библиотеку COM «Библиотека Microsoft Windows Image Acquisition Library v2.0».
После того, как вы добавили ссылку вы можете перечислить совместимые устройства WIA.
var deviceManager = new DeviceManager();
for (int i = 1; i <= deviceManager.DeviceInfos.Count; i++)
{
var deviceName =
deviceManager.DeviceInfos[i].Properties["Name"].get_Value().ToString();
// Is the device a scanner?
if (deviceManager.DeviceInfos[i].Type == WiaDeviceType.ScannerDeviceType)
{
//...etc.
}
}
Примечания: Убедитесь, что для лечения массива DeviceInfos как 1-baed массива вместо массива с отсчетом от нуля! Если вы этого не сделаете, вы получите исключения COM.
Когда вы найдете свой сканер в массиве DeviceInfos [...], вы можете подключиться к нему.
DeviceInfo deviceInfo = deviceManager.DeviceInfos[1];
deviceInfo.Connect();
После подключения вы можете управлять им. Давайте сканируем изображение.
// Start the scan
var item = deviceInfo.Items[1];
var imageFile = (ImageFile) item.Transfer(FormatID.wiaFormatJPEG);
Вы можете найти более подробную информацию о выше здесь:
Windows Image Acquisition (WIA)
Используя API WIA вы по крайней мере, в состоянии обнаружить, если сканер подключен к системе и включен. Это касается вопроса включения/выключения.
Вы также можете использовать WIA для запроса свойств устройства.
Scanner Device Property Constants
Следующее свойство устройства может заинтересовать:
WIA_DPS_DOCUMENT_HANDLING_STATUS: Содержит текущее состояние установленного планшетного сканера, устройство подачи документов или двусторонней печати (готовый, замятие бумаги, ошибка лампы ... и т.д.).
Запросить WIA_DPS_DOCUMENT_HANDLING_STATUS, чтобы проверить текущий статус сканера.
Например:
class WIA_PROPERTIES
{
public const uint WIA_RESERVED_FOR_NEW_PROPS = 1024;
public const uint WIA_DIP_FIRST = 2;
public const uint WIA_DPA_FIRST = WIA_DIP_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
public const uint WIA_DPC_FIRST = WIA_DPA_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
// Scanner only device properties
public const uint WIA_DPS_FIRST = WIA_DPC_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
public const uint WIA_DPS_DOCUMENT_HANDLING_STATUS = WIA_DPS_FIRST + 13;
}
Property documentHandlingStatus = null;
foreach (Property property in device.Properties)
{
string propertyName = property.Name;
string propertyValue = property.get_Value().ToString();
if (property.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_STATUS)
{
// ...
}
}
Checkout заголовочный файл WiaDef.h Microsoft для значений этих констант свойств устройства.
WiaDef.h
Я думаю, вы уже видели http://stackoverflow.com/questions/296182/how-to-get-printer-info-in-net. Разве это не отвечает на ваш вопрос? – Ando
Проблема заключается в том, что WMI не показывает HP Scanner в качестве устройства. Он отображается на панели управления Win-7, как в разделе «Устройства и сканер» в разделе «Устройства». Когда я запрашиваю через WMI, он не показывает его. – HotTester