using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // 有关程序集的常规信息通过以下 // 特性集控制。更改这些特性值可修改 // 与程序集关联的信息。 [assembly: AssemblyTitle("TestActiveX")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("TestActiveX")] [assembly: AssemblyCopyright("Copyright ? 2014")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // 将 ComVisible 设置为 false 使此程序集中的类型 // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, // 则将该类型上的 ComVisible 特性设置为 true。 [assembly: ComVisible(true)] // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID [assembly: Guid("0914bbdc-9ef9-4373-951d-d8c0a2b28348")] [assembly:System.Security.AllowPartiallyTrustedCallers()] // 程序集的版本信息由下面四个值组成: // // 主版本 // 次版本 // 生成号 // 修订号 // // 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, // 方法是按如下所示使用“*”: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Runtime.InteropServices;
namespace
TestActiveX
{ //Guid唯一,不可变更,否则将无法通过IE浏览器的ActiveX控件的安全认证
[ComImport, Guid( "CB5BDC81-93C1-11CF-8F20-00805F2CD064" )]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public
interface
IObjectSafety
{
[PreserveSig]
void
GetInterfacceSafyOptions(
int
riid,
out
int
pdwSupportedOptions,
out
int
pdwEnabledOptions);
[PreserveSig]
void
SetInterfaceSafetyOptions(
int
riid,
int
dwOptionsSetMask,
int
dwEnabledOptions);
}
} |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
|
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Runtime.InteropServices;
namespace
TestActiveX
{ public
class
WebCam
{
#region 参数
private
const
int
WM_USER = 0x400;
private
const
int
WS_CHILD = 0x40000000;
private
const
int
WS_VISIBLE = 0x10000000;
private
const
int
WM_CAP_START = WM_USER;
private
const
int
WM_CAP_STOP = WM_CAP_START + 68;
private
const
int
WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
private
const
int
WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
private
const
int
WM_CAP_SAVEDIB = WM_CAP_START + 25;
private
const
int
WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
private
const
int
WM_CAP_SEQUENCE = WM_CAP_START + 62;
private
const
int
WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
private
const
int
WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;
private
const
int
WM_CAP_SET_OVERLAY = WM_CAP_START + 51;
private
const
int
WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
private
const
int
WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
private
const
int
WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;
private
const
int
WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;
private
const
int
WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;
private
const
int
WM_CAP_SET_SCALE = WM_CAP_START + 53;
private
const
int
WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;
private
IntPtr hWndC;
private
bool
bStat = false ;
private
IntPtr mControlPtr;
private
int
mWidth;
private
int
mHeight;
private
int
mLeft;
private
int
mTop;
private
string
GrabImagePath = "" ;
private
string
KinescopePath = "" ;
#endregion
/// <summary>
/// 初始化摄像头
/// </summary>
/// <param name="handle">控件的句柄</param>
/// <param name="left">开始显示的左边距</param>
/// <param name="top">开始显示的上边距</param>
/// <param name="width">要显示的宽度</param>
/// <param name="height">要显示的长度</param>
public
WebCam(IntPtr handle, int
left, int
top, int
width, int
height)
{
mControlPtr = handle;
mWidth = width;
mHeight = height;
mLeft = left;
mTop = top;
}
#region "属性设置"
/// <summary>
/// 视频左边距
/// </summary>
public
int
Left
{
get
{ return
mLeft; }
set
{ mLeft = value; }
}
/// <summary>
/// 视频上边距
/// </summary>
public
int
Top
{
get
{ return
mTop; }
set
{ mTop = value; }
}
/// <summary>
/// 视频宽度
/// </summary>
public
int
Width
{
get
{ return
mWidth; }
set
{ mWidth = value; }
}
/// <summary>
/// 视频高度
/// </summary>
public
int
Height
{
get
{ return
mHeight; }
set
{ mHeight = value; }
}
/// <summary>
/// 抓图文件存放路径
/// 例:d:\a.bmp
/// </summary>
public
string
grabImagePath
{
get
{ return
GrabImagePath; }
set
{ GrabImagePath = value; }
}
/// <summary>
/// 录像文件存放路径
/// 例:d:\a.avi
/// </summary>
public
string
kinescopePath
{
get
{ return
KinescopePath; }
set
{ KinescopePath = value; }
}
#endregion
[DllImport( "avicap32.dll" )]
private
static
extern
IntPtr capCreateCaptureWindowA( byte [] lpszWindowName, int
dwStyle, int
x, int
y, int
nWidth, int
nHeight, IntPtr hWndParent, int
nID);
[DllImport( "avicap32.dll" )]
private
static
extern
int
capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int
wSize);
[DllImport( "User32.dll" )]
private
static
extern
bool
SendMessage(IntPtr hWnd, int
wMsg, int
wParam, long
lParam);
/// <summary>
/// 开始显示图像
/// </summary>
public
void
Start()
{
if
(bStat)
return ;
bStat = true ;
byte [] lpszName = new
byte [100];
hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0);
if
(hWndC.ToInt32() != 0)
{
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
}
return ;
}
/// <summary>
/// 停止显示
/// </summary>
public
void
Stop()
{
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
bStat = false ;
}
/// <summary>
/// 抓图
/// </summary>
public
void
GrabImage()
{
IntPtr hBmp = Marshal.StringToHGlobalAnsi(GrabImagePath);
SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64());
}
/// <summary>
/// 录像
/// </summary>
public
void
Kinescope()
{
IntPtr hBmp = Marshal.StringToHGlobalAnsi(KinescopePath);
SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64());
SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
}
/// <summary>
/// 停止录像
/// </summary>
public
void
StopKinescope()
{
SendMessage(hWndC, WM_CAP_STOP, 0, 0);
}
}
} |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Drawing;
using
System.Data;
using
System.Text;
using
System.Windows.Forms;
using
System.Runtime.InteropServices;
namespace
TestActiveX
{ [Guid( "412DE68D-3082-4C67-83FC-DBFBBFA9597B" ), ComVisible( true )]
public
partial
class
MyActiveXControl : UserControl, IObjectSafety
{
#region IObjectSafety 成员 用于ActiveX控件安全信任
public
void
GetInterfacceSafyOptions( int
riid, out
int
pdwSupportedOptions, out
int
pdwEnabledOptions)
{
pdwSupportedOptions = 1;
pdwEnabledOptions = 2;
}
public
void
SetInterfaceSafetyOptions( int
riid, int
dwOptionsSetMask, int
dwEnabledOptions)
{
throw
new
NotImplementedException();
}
#endregion
/// <summary>
/// 摄像头驱动对象
/// </summary>
public
WebCam webCame = null ;
public
MyActiveXControl()
{
InitializeComponent();
//开启摄像头
start();
}
private
void
start()
{
//以panel1为容器显示视频内容
webCame = new
WebCam(panel1.Handle, 0, 0, this .panel1.Width, this .panel1.Height);
webCame.Start();
}
/// <summary>
/// 开启摄像头
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private
void
btnStart_Click( object
sender, EventArgs e)
{
webCame.Start();
}
/// <summary>
/// 停止摄像头
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private
void
btnStop_Click( object
sender, EventArgs e)
{
webCame.Stop();
}
/// <summary>
/// 截图
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private
void
btnSave_Click( object
sender, EventArgs e)
{
saveFileDialog1.Filter = "JPEG图片(*.jpg)|*.jpg" ;
if
(saveFileDialog1.ShowDialog() == DialogResult.OK)
{
webCame.grabImagePath = saveFileDialog1.FileName;
webCame.GrabImage();
}
}
}
} |
<html> <title>Powered by 饕餮 www.easyyh.com</title> <head> </head> <body> <div> <object id="yyzq" classid="clsid:412DE68D-3082-4C67-83FC-DBFBBFA9597B" width="523" height="323" > </object> </div> </body> </html>