使用WIA,C#和Win 7捕获相机

我尝试在Windows 7上使用WIA 2.0,C#,。net 4.0从网络摄像头拍照。我尝试了许多不同的样本,但没有任何效果。 我总是得到这个exception:“ComException未处理”来自HRESULT的exception: 0x80210015 “。代码是WIA_S_NO_DEVICE_AVAILABLE 。我检查过,如果WIA-Service正在运行并且凸轮出现在扫描仪和相机中。我不知道这里有什么问题有人可以帮忙吗?

此行抛出exception:

设备d = class1.ShowSelectDevice(WiaDeviceType.CameraDeviceType,true,false);:

这里的代码

 string DeviceID; const string wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"; const string wiaFormatPNG = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"; const string wiaFormatGIF = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"; const string wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"; const string wiaFormatTIFF = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"; class WIA_DPS_DOCUMENT_HANDLING_SELECT { public const uint FEEDER = 0x00000001; public const uint FLATBED = 0x00000002; } class WIA_DPS_DOCUMENT_HANDLING_STATUS { public const uint FEED_READY = 0x00000001; } 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 (DPS) // 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; public const uint WIA_DPS_DOCUMENT_HANDLING_SELECT = WIA_DPS_FIRST + 14; } class WIA_ERRORS { public const uint BASE_VAL_WIA_ERROR = 0x80210000; public const uint WIA_ERROR_PAPER_EMPTY = BASE_VAL_WIA_ERROR + 3; } public void ADFScan() { //Choose Scanner CommonDialogClass class1 = new CommonDialogClass(); Device d = class1.ShowSelectDevice(WiaDeviceType.CameraDeviceType, true, false); if (d != null) { this.DeviceID = d.DeviceID; } else { //no scanner chosen return; } WIA.CommonDialog WiaCommonDialog = new CommonDialogClass(); bool hasMorePages = true; int x = 0; int numPages = 0; while (hasMorePages) { //Create DeviceManager DeviceManager manager = new DeviceManagerClass(); Device WiaDev = null; foreach (DeviceInfo info in manager.DeviceInfos) { if (info.DeviceID == this.DeviceID) { WIA.Properties infoprop = null; infoprop = info.Properties; //connect to scanner WiaDev = info.Connect(); break; } } //Start Scan WIA.ImageFile img = null; WIA.Item Item = WiaDev.Items[1] as WIA.Item; try { img = (ImageFile)WiaCommonDialog.ShowTransfer(Item, wiaFormatJPEG, false); //process image: //one would do image processing here // //Save to file string varImageFileName = "c:\\test" + x.ToString() + ".jpg"; if (File.Exists(varImageFileName)) { //file exists, delete it File.Delete(varImageFileName); } img.SaveFile(varImageFileName); numPages++; img = null; } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } finally { Item = null; //determine if there are any more pages waiting Property documentHandlingSelect = null; Property documentHandlingStatus = null; foreach (Property prop in WiaDev.Properties) { if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_SELECT) documentHandlingSelect = prop; if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_STATUS) documentHandlingStatus = prop; } hasMorePages = false; //assume there are no more pages if (documentHandlingSelect != null) //may not exist on flatbed scanner but required for feeder { //check for document feeder if ((Convert.ToUInt32(documentHandlingSelect.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER) != 0) { hasMorePages = ((Convert.ToUInt32(documentHandlingStatus.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_STATUS.FEED_READY) != 0); } } x++; } } } 

谢谢你的帮助!

这是来自Microsoft的未记录错误的典型示例…错误代码仅表示未找到任何设备,未连接或未连接 – WIA已识别。

如果连接了相机,尝试添加像CameraTest这样的方法进行测试:

 bool CameraTest() { bool present = false; try { Device d = class1.ShowSelectDevice(WiaDeviceType.CameraDeviceType, true, false); present = true; } catch (Exception ex) {} return present; } 

请尝试以下代码:

 class WIAScanner { const string wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"; class WIA_DPS_DOCUMENT_HANDLING_SELECT { public const uint FEEDER = 0x00000001; public const uint FLATBED = 0x00000002; } class WIA_DPS_DOCUMENT_HANDLING_STATUS { public const uint FEED_READY = 0x00000001; } 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 (DPS) // 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; public const uint WIA_DPS_DOCUMENT_HANDLING_SELECT = WIA_DPS_FIRST + 14; } ///  /// Use scanner to scan an image (with user selecting the scanner from a dialog). ///  /// Scanned images. public static List Scan() { WIA.ICommonDialog dialog = new WIA.CommonDialog(); WIA.Device device = dialog.ShowSelectDevice(WIA.WiaDeviceType.UnspecifiedDeviceType, true, false); if (device != null) { return Scan(device.DeviceID); } else { throw new Exception("You must select a device for scanning."); } } ///  /// Use scanner to scan an image (scanner is selected by its unique id). ///  ///  /// Scanned images. public static List Scan(string scannerId) { List images = new List(); bool hasMorePages = true; while (hasMorePages) { // select the correct scanner using the provided scannerId parameter WIA.DeviceManager manager = new WIA.DeviceManager(); WIA.Device device = null; foreach (WIA.DeviceInfo info in manager.DeviceInfos) { if (info.DeviceID == scannerId) { // connect to scanner device = info.Connect(); break; } } // device was not found if (device == null) { // enumerate available devices string availableDevices = ""; foreach (WIA.DeviceInfo info in manager.DeviceInfos) { availableDevices += info.DeviceID + "\n"; } // show error with available devices throw new Exception("The device with provided ID could not be found. Available Devices:\n" + availableDevices); } WIA.Item item = device.Items[1] as WIA.Item; try { // scan image WIA.ICommonDialog wiaCommonDialog = new WIA.CommonDialog(); WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, false); // save to temp file string fileName = Path.GetTempFileName(); File.Delete(fileName); image.SaveFile(fileName); image = null; // add file to output list images.Add(Image.FromFile(fileName)); } catch (Exception exc) { throw exc; } finally { item = null; //determine if there are any more pages waiting WIA.Property documentHandlingSelect = null; WIA.Property documentHandlingStatus = null; foreach (WIA.Property prop in device.Properties) { if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_SELECT) documentHandlingSelect = prop; if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_STATUS) documentHandlingStatus = prop; } // assume there are no more pages hasMorePages = false; // may not exist on flatbed scanner but required for feeder if (documentHandlingSelect != null) { // check for document feeder if ((Convert.ToUInt32(documentHandlingSelect.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER) != 0) { hasMorePages = ((Convert.ToUInt32(documentHandlingStatus.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_STATUS.FEED_READY) != 0); } } } } return images; } ///  /// Gets the list of available WIA devices. ///  ///  public static List GetDevices() { List devices = new List(); WIA.DeviceManager manager = new WIA.DeviceManager(); foreach (WIA.DeviceInfo info in manager.DeviceInfos) { devices.Add(info.DeviceID); } return devices; } }