(转)在C#中使用WIA获取扫描仪数据(五、注册事件)
来源:互联网 发布:电力系统算法工程师 编辑:程序博客网 时间:2024/05/18 00:59
好了,现在我们能在c#里通过编程扫描图像了。还不满足?对,在前面的例子里,需要扫描的时候总是要按下一个扫描按钮,既傻又费事。现在的扫描仪,上面往往会多几个额外的按钮用来和用户交互,例如我是用的HPG2410上就有两个按钮:扫描及复制。那么,能不能用这两个按钮来代替程序里的那个难看的按钮呢?
注意左上角那个难看的按钮了吗?
在WIAAL里,我们可以同过注册设备事件,监听事件等方式和设备上的按钮交互。
注册事件
还记得我们在上节提到的DeviceManager对象吗?MSDN官方文档描述:
The Microsoft Windows Image Acquisition (WIA) Device Manager is anextension of the Still Image (STI) Event Monitor. The WIA DeviceManager provides objects, methods, and interfaces for the following:
- Installing devices
- Enumerating devices
- Querying properties of installed devices
- Creating device objects
- Monitoring device events
- Acquiring images
- Registering destination applications.
和传统.Net编程不同,WIA的事件,需要先通过DeviceManager的RegisterEvent的方法注册,才能使用。RegisterEvent定义如下:
void RegisterEvent(string EventID, string DeviceID);
其中,EventID是事件的GUID,DeviceID是扫描仪的GUID。在类EventID里,WIA定义了几种基本的事件类型,从定义上不难理解这些ID的所代表的具体事件:
public const string wiaEventDeviceConnected = "{A28BBADE-64B6-11D2-A231-00C04FA31809}";
public const string wiaEventDeviceDisconnected = "{143E4E83-6497-11D2-A231-00C04FA31809}";
public const string wiaEventItemCreated = "{4C8F4EF5-E14F-11D2-B326-00C04F68CE61}";
public const string wiaEventItemDeleted = "{1D22A559-E14F-11D2-B326-00C04F68CE61}";
public const string wiaEventScanEmailImage = "{C686DCEE-54F2-419E-9A27-2FC7F2E98F9E}";
public const string wiaEventScanFaxImage = "{C00EB793-8C6E-11D2-977A-0000F87A926F}";
public const string wiaEventScanFilmImage = "{9B2B662C-6185-438C-B68B-E39EE25E71CB}";
public const string wiaEventScanImage = "{A6C5A715-8C6E-11D2-977A-0000F87A926F}";
public const string wiaEventScanImage2 = "{FC4767C1-C8B3-48A2-9CFA-2E90CB3D3590}";
public const string wiaEventScanImage3 = "{154E27BE-B617-4653-ACC5-0FD7BD4C65CE}";
public const string wiaEventScanImage4 = "{A65B704A-7F3C-4447-A75D-8A26DFCA1FDF}";
public const string wiaEventScanOCRImage = "{9D095B89-37D6-4877-AFED-62A297DC6DBE}";
public const string wiaEventScanPrintImage = "{B441F425-8C6E-11D2-977A-0000F87A926F}";
例如,我们可以使用以下来吗来注册一个事件,并监听它:
manager.RegisterEvent(EventID.wiaEventScanImage, device.DeviceID);
manager.OnEvent += (eventID, deviceID, itemID) =>
{
//…………
}
枚举设备事件
如果你向我这般,兴冲冲地在OnEvent里加入扫描处理逻辑,然后按下HP G2410上的扫描按钮,你一定会像我一样,在漫长的等待中渐渐失望:扫描仪根本没有按我所想的那样扫描图片。也就是说,wiaEventScanImage这个事件根本不起作用。
幸好能够通过Device类来枚举设备支持的事件,我写了以下一段代码:
Console.WriteLine("Events:");
foreach (DeviceEvent eve in device.Events)
{
Console.WriteLine("{0}:{1}:{2}", eve.EventID, eve.Name, eve.Description);
}
运行后,发现该扫描仪仅仅支持wiaEventDeviceConnected 和 wiaEventDeviceDisconnected ,以及两个HP自定义的事件:按下扫描按钮、按下拷贝按钮。OOXX!
按下按钮扫描图像
修改manager.RegisterEvent方法,使用HP提供的EventID:
manager.RegisterEvent("{0C5E2143-FD9B-490B-9AD5-7637A403566B}", device.DeviceID);
最终我们可以通过按下扫描仪上的扫描按钮来扫描数据了!:)
manager.OnEvent += (eventID, deviceID, itemID) =>
{
Item item = device.Items[1];
CommonDialogClass cdc = new WIA.CommonDialogClass();
ImageFile imageFile = cdc.ShowTransfer(item,
"{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}",
true) as ImageFile;
if (imageFile != null)
{
var buffer = imageFile.FileData.get_BinaryData() as byte[];
using (MemoryStream ms = new MemoryStream())
{
ms.Write(buffer, 0, buffer.Length);
pictureBox1.Image = Image.FromStream(ms);
}
}
};
- (转)在C#中使用WIA获取扫描仪数据(五、注册事件)
- (转)在C#中使用WIA获取扫描仪数据(二、WIA Automation Layer)
- 在C#中使用WIA获取扫描仪数据(一)
- 在C#中使用WIA获取扫描仪数据(二、WIA Automation Layer)
- (转) 在C#中使用WIA获取扫描仪数据(三、利用Filter处理图片)
- (转)在C#中使用WIA获取扫描仪数据(一)
- 在C#中使用WIA获取扫描仪数据
- 在C#中使用WIA获取扫描仪数据
- (转)在C#中使用WIA获取扫描仪数据(四、通过编程方式扫描图像)
- WIA扫描仪驱动
- 用 WIA对象 编程使用扫描仪的例子
- c#使用扫描仪
- C# 在类中如何注册事件与取消事件注册?
- C# 中扫描仪的连接
- C# 中扫描仪的连接
- 在Delphi中控制扫描仪
- 在Delphi中控制扫描仪
- 在Delphi中控制扫描仪
- linux下各种格式的压缩包的压缩、解压方法
- 过完元旦就工作
- C++ 拷贝构造函数和赋值构造函数
- (转)在C#中使用WIA获取扫描仪数据(四、通过编程方式扫描图像)
- 在Wince5.0中实现关机功能
- (转)在C#中使用WIA获取扫描仪数据(五、注册事件)
- 第11章 持有对象
- 第1章 导言
- 12 25
- 常用的函数调用约定 stdcall/cdecl/fastcall
- 树和二叉树
- 在vMware装上linux鼠标无法使用问题解答
- div覆盖在dropdownlist之上的方法
- VNC怎么和宿主机共享粘贴板