您的位置:首页 > 编程语言 > C#

(转)在C#中使用WIA获取扫描仪数据(五、注册事件)

2009-12-24 16:25 309 查看
好了,现在我们能在c#里通过编程扫描图像了。还不满足?对,在前面的例子里,需要扫描的时候总是要按下一个扫描按钮,既傻又费事。现在的扫描仪,
上面往往会多几个额外的按钮用来和用户交互,例如我是用的HP
G2410上就有两个按钮:扫描及复制。那么,能不能用这两个按钮来代替程序里的那个难看的按钮呢?



注意左上角那个难看的按钮了吗?
在WIAAL里,我们可以同过注册设备事件,监听事件等方式和设备上的按钮交互。

注册事件

还记得我们在上节提到的DeviceManager对象吗?MSDN官方文档描述:

The Microsoft Windows Image Acquisition (WIA) Device Manager is an
extension of the Still Image (STI) Event Monitor. The WIA Device
Manager 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
);

}

}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: