如何从HWND(句柄)得到对象的类型, 并操作它?100分相送!!!

biku 2005-01-21 11:17:16
我能得到当前鼠标指向的窗口的句柄,但我如何确定该窗口是不是资源管理器窗口(比如:我的文档)?(不要用标题来判断。)假设我能判断出它是一个资源管理器,那么我如何得到这个资源管理器的地址?

简而言之:我只想当鼠标指向一个窗口的时候就能判断是否为资源管理器,是则获得其地址。
...全文
411 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
biku 2005-01-24
  • 打赏
  • 举报
回复
TO:dongge2000
非常感谢你的帮助。你的代码我也试了。但是VB老是提示错误。
运行到“If WndToProcId(MyWin(i).hwnd) = WndToProcId(MouseDC.MDC) Then”中的“MyWin(i).hwnd”就提示:对象HWND的方法‘IWebBrowser2’失败。晕啊!

还有我说的代码中出现“objIE.hWnd ”也失败啊!真是搞不懂。


唉,结帖,另开新帖!
biku 2005-01-23
  • 打赏
  • 举报
回复
如果还不能解决的话,明天就结帖。然后再开新帖。
biku 2005-01-23
  • 打赏
  • 举报
回复
我的思路遇到难题了!!

'一个按钮,两个LISTBOX。
'请引用 Microsoft Internet Controls
Private Sub Command1_Click()

Dim objIE As InternetExplorer
Dim dWinFolder As New ShellWindows

For Each objIE In dWinFolder

List1.AddItem objIE.hWnd '为什么这一句会出现“自动化错误”呢?你们测试一下会不会?

List2.AddItem objIE.LocationURL
Next

End Sub

如果把那一句去掉就正常????为什么呢?不知道该如何解决》
biku 2005-01-23
  • 打赏
  • 举报
回复
jiangsheng(蒋晟.MSMVP2004Jan)谢谢你。不过那好象是C语言写的吧?我看不懂啊。有没有关于用VB写的呢?
laisiwei 2005-01-23
  • 打赏
  • 举报
回复
up
dongge2000 2005-01-23
  • 打赏
  • 举报
回复
For i = 0 To MyWin.Count - 1
If WndToProcId(MyWin(i).hwnd) = WndToProcId(MouseDC.MDC) Then
Dim Str As String
Str = Right(MyWin(i).LocationURL, Len(MyWin(i).LocationURL) - 8)
Text1.Text = Replace(Str, "/", "\")
End If
Next
--------------
我这句怎么就行呢,楼主没有看吗?
dyshadow 2005-01-22
  • 打赏
  • 举报
回复
偶不懂,看来只能关注一下了
viena 2005-01-22
  • 打赏
  • 举报
回复
先占个位子,等人来回答,呵呵~
dongge2000 2005-01-22
  • 打赏
  • 举报
回复
晕,错了,不好意思,它们是一个进程的。
smx717616 2005-01-22
  • 打赏
  • 举报
回复
viena(维也纳nn-实心木头人石欠RUKYO) ( ) 信誉:1

靠,强
dongge2000 2005-01-22
  • 打赏
  • 举报
回复
Option Explicit
Dim MyWin As ShellWindows

Private Sub Form_Load()
Set MyWin = New ShellWindows
Timer1.Interval = 1000
End Sub

Private Sub Form_Unload(Cancel As Integer)
Set MyWin = Nothing
End Sub

Private Sub Timer1_Timer()
If MyWin.Count = 0 Then Exit Sub
Dim i As Long
For i = 0 To MyWin.Count - 1
If WndToProcId(MyWin(i).hwnd) = WndToProcId(MouseDC.MDC) Then
Dim Str As String
Str = Right(MyWin(i).LocationURL, Len(MyWin(i).LocationURL) - 8)
Text1.Text = Replace(Str, "/", "\")
End If
Next
End Sub
------------------------------
Option Explicit
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Public Declare Function WindowFromPoint Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Type POINTAPI
x As Long
y As Long
End Type

Public Type DGfor3
ponX As Long
ponY As Long
MDC As Long
End Type

Public Function MouseDC() As DGfor3
On Error Resume Next
Dim Cur As POINTAPI
GetCursorPos Cur
MouseDC.MDC = WindowFromPoint(Cur.x, Cur.y)
MouseDC.ponX = Cur.x
MouseDC.ponY = Cur.y
End Function

Public Function TitleToWnd(ByVal strTitle As String, Optional strClassName As String = vbNullString) As Long
TitleToWnd = FindWindow(strClassName, strTitle)
End Function

Public Function WndToProcId(ByVal hwnd As Long) As Long
GetWindowThreadProcessId hwnd, WndToProcId
End Function
---------------
FORM1中有一个TEXT、TIMER。
biku 2005-01-22
  • 打赏
  • 举报
回复
晕!都没人回答就学习!!
viena 2005-01-22
  • 打赏
  • 举报
回复
学习~
biku 2005-01-22
  • 打赏
  • 举报
回复
'一个按钮,两个LISTBOX。
'请引用 Microsoft Internet Controls
Private Sub Command1_Click()

Dim objIE As InternetExplorer
Dim dWinFolder As New ShellWindows

For Each objIE In dWinFolder

List1.AddItem objIE.hWnd '为什么这一句会出现“自动化错误”呢?你们测试一下会不会?

List2.AddItem objIE.LocationURL
Next

End Sub

如果把那一句去掉就正常????为什么呢?
biku 2005-01-22
  • 打赏
  • 举报
回复
好象要用到SHELLWINDOWS之类的。
dongge2000 2005-01-22
  • 打赏
  • 举报
回复
Option Explicit

Private Sub Command1_Click() '向上用
Dim Arr() As String
Dim i As Long
Dim sRet As String
Dim Str As String
Str = Text1.Text
If Right(Str, 1) = "\" Then Str = Left(Str, Len(Str) - 1)
Arr = Split(Str, "\")
For i = LBound(Arr) To UBound(Arr) - 1
If Len(Arr(i)) > 0 Then
sRet = sRet & Arr(i) & "\"
End If
Next
MsgBox sRet
End Sub

Private Sub Timer1_Timer() 'timer1.Interval=3000,后退用
SendKeys Chr(8)
End Sub
biku 2005-01-22
  • 打赏
  • 举报
回复
哈哈!真的有难度的吗?

把“资源管理器”换成IE也行啊!!!
biku 2005-01-22
  • 打赏
  • 举报
回复
呵呵,成功的话,一定贴出来!!!

我菜鸟一个,还得大家帮帮忙忙呢!!
dongge2000 2005-01-22
  • 打赏
  • 举报
回复
楼主写完贴出来,大家共享先!我还不会SHELLWINDOWS呢!
dongge2000 2005-01-22
  • 打赏
  • 举报
回复
呵呵,我写的TIMER是一秒运行一次,就是太占系统资源了。你再加个MOUSE的操作。
-----------------
Option Explicit

Public Declare Function WindowFromPoint Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Type POINTAPI
x As Long
y As Long
End Type

Public Type DGfor3
ponX As Long
ponY As Long
MDC As Long
End Type

Public Function MouseDC() As DGfor3
On Error Resume Next
Dim Cur As POINTAPI
GetCursorPos Cur
MouseDC.MDC = WindowFromPoint(Cur.x, Cur.y)
MouseDC.ponX = Cur.x
MouseDC.ponY = Cur.y
End Function
加载更多回复(16)
作为Microsoft 32位平台的应用程序编程接口,Win32 API是从事Windows应用程序开发所必备的。本书首先对Win32 API函数做完整的概述;然后收录五大类函数:窗口管理、图形设备接口、系统服务、国际特性以及网络服务;在附录部分,讲解如何在Visual Basic和Delphi中对其调用。 本书是从事Windows应用程序开发的软件工程师的必备参考手册。 Win32 API作为 Microsoft 32位平台(包括:Windows 9x,Windows NT3.1/4.0/5.0,WindowsCE)的应用程序编程接口,它是构筑所有32位Windows平台的基石,所有在Windows平台上运行的应用程序都可以调用这些函数。 从事Windows应用程序开发,离不开对Win32 API函数的调用。只有充分理解和利用API函数,才能深入到Windows的内部,充分挖掘系统提供的强大功能和灵活性。 近年来,随着Microsoft 32位平台的版本升级, Win32 API函数的构成、功能与调用方式都有很大的发展变化,然而,国内很少有相关的新版资料出版。为了满足广大开发人员的迫切需求,我们经过认真收集、整理素材,组织编写了这本与各种Microsoft 32位平台最新版本同步的Win32 API参考手册。 全书收录了五大类函数:窗口管理、图形设备接口、系统服务、国际特性以及网络服务。所有函数均附有功能说明、参数说明、返回值说明、备注以及引用说明。另外,在本书的第一章,我们对WiN32 API函数作了完整的概述;在附录部分,讲解了如何在Visual Basic和Delphi中对其调用。 由于篇幅较大,涉及技术内容广泛,加之时间仓促,书中难免存在不少错误或疏漏,希望广大读者给与批评指正。 在Windows程序设计领域处于发展初期时,Windows程序员可使用的编程工具唯有API函数。这些函数在程序员手中犹如"积木块"一样,可搭建出各种界面丰富、功能灵活的应用程序。不过,由于这些函数结构复杂,所以往往难以理解,而且容易误用。 随着软件技术的不断发展,在Windows平台上出现了很多优秀的可视化编程环境,程序员可以采用"所见即所得"的编程方式来开发具有精美用户界面和功能的应用程序。这些可视化编程环境操作简便、界面友好,比如:Visual C++,Delphi,Visual Basic等等。在这些工具中提供了大量的类库和各种控件,它们替代了API的神秘功能。事实上,这些类库和控件都是构筑在Windows API的基础上的,但它们使用方便,加速了Windows应用程序的开发,所以受到程序员的普遍采用。有了这些类库和控件,程序员们便可以把主要精力放在整体功能的设计上,而不必过于关注具体细节。不过,这也导致了非常多的程序员在类库面前"固步自封",对下层API函数的强大功能一无所知。 实际上。程序员要想开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用API函数。虽然类库和控件使应用程序的开发容易得多,但它们只提供Microsoft Windows的一般功能,对于一些比较复杂和特殊的功能来说,单使用类库和控件是难以实现的,必须直接使用API函数来编写。API函数是构筑整个Windows框架的基石,只有充分理解和利用API函数,才能深入到Windows的内部,充分发挥各种32位平台的强大功能和灵活性,才能成功地扩展和突破类库、控件和可视开发环境的限制。 Win32 API即为Microsoft 32位平台的应用程序编程接口(Application Programming Interface)。所有在Win32平台上运行的应用程序都可以调用这些函数。 使用Win32 API,应用程序可以充分挖掘Windows的32位操作系统的潜力。 Mircrosoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用 Win32 API不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。 在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些函数只能在更强大的平台上实现其功能。例如,安全函数只能在Windows NT操作系统下使用。另外一些主要差别就是系统限制,比如值的范围约束,或函数可管理的项目个数等等。 标准Win32 API函数可以分为以下几类: 窗口管理 窗口通用控制 Shell特性 图形设备接口 系统服务 国际特性 网络服务 在下面各节中,我们分别介绍这7种类型的API函数。 窗口管理函数向应用程序提供了一些创建和管理用户界面的方法。你可以使用窗口管理函数创建和使用窗口来显示输出、提示用户进行输入以及
using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Data; using System.Drawing; using System.Windows.Forms; using System.Runtime.InteropServices; namespace DS40XXSDK { #region enum /// /// 板卡类型 /// public enum BOARD_TYPE_DS : uint { DS400XM = 0, //M卡 DS400XH = 1, //H卡 DS4004HC = 2, //4004HC DS4008HC = 3, //4008HC DS4016HC = 4, //4016HC DS4001HF = 5, //4001HF DS4004HF = 6, //4004HF DS4002MD = 7, //4002MD DS4004MD = 8, //4004MD DS4016HCS = 9, //4016HCS DS4002HT = 10, //4002HT DS4004HT = 11, //4004HT DS4008HT = 12, //4008HT DS4004HC_PLUS = 13, //4004HC+ DS4008HC_PLUS = 14, //4008HC+ DS4016HC_PLUS = 15, //4016HC+ DS4008HF = 16, //4008HF DS4008MD = 17, //4008MD DS4008HS = 18, //4008HS DS4016HS = 19, //4016HS INVALID_BOARD_TYPE = 0xffffffff, } /// /// 视频预览格式 /// public enum TypeVideoFormat { vdfRGB8A_233 = 0x00000001, vdfRGB8R_332 = 0x00000002, vdfRGB15Alpha = 0x00000004, /// /// 16位RGB视频压缩格式 /// vdfRGB16 = 0x00000008, /// /// 24位RGB视频压缩格式 /// vdfRGB24 = 0x00000010, vdfRGB24Alpha = 0x00000020, vdfYUV420Planar = 0x00000040, /// /// YUV422视频压缩格式 /// vdfYUV422Planar = 0x00000080, vdfYUV411Planar = 0x00000100, vdfYUV420Interspersed = 0x00000200, vdfYUV422Interspersed = 0x00000400, vdfYUV411Interspersed = 0x00000800, vdfYUV422Sequence = 0x00001000, /* U0, Y0, V0, Y1: For VO overlay */ vdfYUV422SequenceAlpha = 0x00002000, /* U0, Y0, V0, Y1: For VO overlay, with low bit for alpha blending */ vdfMono = 0x00004000, /* 8 bit monochrome */ vdfYUV444Planar = 0x00008000, }; /// /// 视频制式 /// public enum VideoStandard_t : uint { /// /// 无视频信号 /// StandardNone = 0x80000000, /// /// NTSC制式 /// StandardNTSC = 0x00000001, /// /// PAL制式 /// StandardPAL = 0x00000002, StandardSECAM = 0x00000004, } ; /// /// 编码图像分辨率 /// public enum PictureFormat_t { ENC_CIF_FORMAT = 0, ENC_QCIF_FORMAT = 1, ENC_2CIF_FORMAT = 2, ENC_4CIF_FORMAT = 3, ENC_QQCIF_FORMAT = 4, ENC_CIFQCIF_FORMAT = 5, ENC_CIFQQCIF_FORMAT = 6, ENC_DCIF_FORMAT = 7 }; /// /// 码流控制方式 /// public enum BitrateControlType_t { /// /// 变码率 /// brCBR = 0, /// /// 恒定码率 /// brVBR = 1, }; public enum FrameType_t { PktError = 0, PktIFrames = 0x0001, PktPFrames = 0x0002, PktBBPFrames = 0x0004, PktAudioFrames = 0x0008, PktMotionDetection = 0x00010, PktDspStatus = 0x00020, PktOrigImage = 0x00040, PktSysHeader = 0x00080, PktBPFrames = 0x00100, PktSFrames = 0x00200, PktSubIFrames = 0x00400, PktSubPFrames = 0x00800, PktSubBBPFrames = 0x01000, PktSubSysHeader = 0x02000 }; #endregion #region struct /// /// 板卡信息结构体 /// public struct DS_BOARD_DETAIL { /// /// 板卡类型 /// BOARD_TYPE_DS type; /// /// 序列号 /// BYTE sn[16]; /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] byte[] sn; /// /// 板卡包含的DSP个数 /// uint dspCount; /// /// 板卡上第一个DSP的索引 /// uint firstDspIndex; /// /// 板卡包含的编码通道个数 /// uint encodeChannelCount; /// /// 板卡上第一个编码通道的索引 /// uint firstEncodeChannelIndex; /// /// 板卡包含的解码通道个数 /// uint decodeChannelCount; /// /// 板卡上第一个解码通道的索引 /// uint firstDecodeChannelIndex; /// /// 板卡包含的视频输出通道个数 /// uint displayChannelCount; /// /// 板卡上第一个视频输出通道的索引 /// uint firstDisplayChannelIndex; uint reserved1; uint reserved2; uint reserved3; /// /// 硬件版本,format:major.minor.build,major:bit 16-19,minor: bit 8-15,build: bit 0-7 /// uint version; } /// /// DSP信息结构体 /// public struct DSP_DETAIL { /// /// 此DSP所包含的编码通道个数 /// uint encodeChannelCount; /// /// 此DSP上第一个编码通道在所有编码通道中的索引 /// uint firstEncodeChannelIndex; /// /// 此DSP所包含的解码通道个数 /// uint decodeChannelCount; /// /// 此DSP上第一个解码通道在所有解码通道中的索引 /// uint firstDecodeChannelIndex; /// /// 此DSP包含的显示通道个数 /// uint displayChannelCount; /// /// 此DSP上第一个显示通道在所有显示通道中的索引 /// uint firstDisplayChannelIndex; uint reserved1; uint reserved2; uint reserved3; uint reserved4; } /// /// 特殊功能结构体 /// public struct CHANNEL_CAPABILITY { /// /// 音频预览 /// byte[] bAudioPreview; /// /// 报警信号 /// byte[] bAlarmIO; /// /// 看家狗 /// byte[] bWatchDog; } /// /// 版本信息 /// public struct PVERSION_INFO { /// /// DSP版本号,DSP的BUILD号,用于软件升级时标明该版本的最后修改时间 /// UInt64 DspVersion, DspBuildNum; /// /// Driver版本号,Driver的BUILD号,用于软件升级时标明该版本的最后修改时间 /// UInt64 DriverVersion, DriverBuildNum; /// /// SDK版本号,SDK的BUILD号,用于软件升级时标明该版本的最后修改时间 /// UInt64 SDKVersion, SDKBuildNum; } /// /// 显示窗口内的矩形区域 /// //[StructLayout(LayoutKind. //public struct RECT //{ // public Int32 left; // public Int32 top; // public Int32 right; // public Int32 bottom; //} /// /// 帧统计信息结构体 /// public struct PFRAMES_STATISTICS { /// /// 视频帧 /// UInt64 VideoFrames; /// /// 音频帧 /// UInt64 AudioFrames; /// /// 丢失帧 /// UInt64 FramesLost; /// /// 丢失的码流(字节) /// UInt64 QueueOverflow; /// /// 当前的帧率(bps) /// UInt64 CurBps; } /// /// 版本信息结构体 /// public struct PHW_VERSION { /// /// DSP程序的版本号和Build号 /// UInt64 DspVersion, DspBuildNum; /// /// 驱动程序的版本号和Build号 /// UInt64 DriverVersion, DriverBuildNum; /// /// SDK 的版本号和Build号 /// UInt64 SDKVersion, SDKBuildNum; } /// /// 系统时间 /// public struct SYSTEMTIME { ushort wYear; ushort wMonth; ushort wDayOfWeek; ushort wDay; ushort wHour; ushort wMinute; ushort wSecond; ushort wMilliseconds; } #endregion #region delegate /// /// 原始图像流设置 /// /// typedef void (*IMAGE_STREAM_CALLBACK)(UINT channelNumber,void *context); /// /// 通道号 /// 设备上下文 public delegate void IMAGE_STREAM_CALLBACK(uint channelNumber, IntPtr context); /// /// 编码数据流直接读取回调函数 /// /// typedef int (*STREAM_DIRECT_READ_CALLBACK)(UInt64 channelNumber,void *DataBuf,DWORD Length,int FrameType,void *context); /// /// 通道号 /// 缓冲区地址 /// 缓冲区长度 /// 缓冲区数据帧类型 /// 设备上下文 /// [UnmanagedFunctionPointer(CallingConvention.Cdecl)] //public delegate int STREAM_DIRECT_READ_CALLBACK(uint channelNumber, byte[] DataBuf, uint Length, FrameType_t FrameType, IntPtr context); public delegate int STREAM_DIRECT_READ_CALLBACK(int channelNumber, IntPtr DataBuf, int Length, FrameType_t FrameType, IntPtr context); //public unsafe delegate int STREAM_DIRECT_READ_CALLBACK(uint channelNumber, void * DataBuf, uint Length, int FrameType, IntPtr context); /// /// 直接读取码流回调函数 /// /// typedef int (*STREAM_READ_CALLBACK)(UInt64 channelNumber, void *context) /// /// 通道号 /// 设备上下文 /// public delegate int STREAM_READ_CALLBACK(UInt64 channelNumber, IntPtr context); /// /// 移动侦测结果回调函数 /// /// typedef void (*MOTION_DETECTION_CALLBACK)(UInt64 channelNumber, BOOL bMotionDetected,void *context) /// /// 通道号 /// /// 移动侦测发生标志,如果当前通道所设置的移动侦测 /// 区域内产生了移动侦测,则被置为True;如果当前通道所设置的移动侦测区域内自上 /// 一次产生移动侦测后delay秒内没有发生移动侦测,则被置为False。 /// /// 设备上下文 public delegate void MOTION_DETECTION_CALLBACK(UInt64 channelNumber, bool bMotionDetected, IntPtr context); /// /// 画图回调函数 /// /// #define DRAWFUN(x) void (CALLBACK* x)(Int32 nPort,HDC hDc,Int32 nUser) /// /// 通道号 /// offscreen表面设备上下文,相当于显示窗口中的DC /// 用户数据 public delegate void DrawFun(Int32 nPort, IntPtr HDC, Int32 nUser); /// /// 解码回调函数 /// /// typedef void (*DECODER_VIDEO_CAPTURE_CALLBACK)(UINT nChannelNumber, void *DataBuf,UINT width,UINT height,UINT nFrameNum,UINT nFrameTime, SYSTEMTIME *pFrameAbsoluteTime,void *context) /// /// 解码通道句柄 /// 缓冲区地址 /// 图像宽度 /// 图像高度 /// 捕获的当前帧的序号 /// 捕获的当前帧的相对时间,单位:毫秒 /// 捕获的当前帧的绝对时间 /// 设备上下文 public delegate void DECODER_VIDEO_CAPTURE_CALLBACK(uint nChannelNumber, IntPtr DataBuf, uint width, uint height, uint nFrameNum, uint nFrameTime, SYSTEMTIME pFrameAbsoluteTime, IntPtr context); /// /// 创建索引完成回调函数 /// /// typedef void (*FILE_REF_DONE_CALLBACK)(UINT nChannel,UINT nSize) /// /// 通道号 /// 索引大小(暂时无效,以后可以增加索引导出、导入功能) public delegate void FILE_REF_DONE_CALLBACK(uint nChannel, uint nSize); #endregion /// /// DS40xxSDK.dll /// public class HikVisionSDK { /// /// 状态 /// public static readonly List state = new List(new string[]{ "", "正在打开", "音频信号丢失", "视频信号丢失", "有物体移动", //0-4 "自动分割录像", "开始录像", "停止录像", "启动声音监听", "停止声音监听", //5-9 "启动视频预览", "停止视频预览", "启动录像", "停止录像", "启动视频报警", //10-14 "关闭视频报警", "启动音频报警", "停止音频报警", "启动移动侦测", "停止移动侦测", //15-19 "启动视频遮挡", "关闭视频遮挡", "开始屏幕输出", "停止屏幕输出", "启动视频LOGO", //20-24 "停止视频LOGO", "开始视频OSD", "停止视频OSD", "切换为黑白视频", "切换为彩色视频", //25-29 "切换为黑屏显示", "切换为白屏显示", "视频色彩复位", "启动全屏显示", "采集卡已经加载", //30-34 "采集卡已经卸截", "视频服务启动成功", "视频服务已停止", "静音", "音量恢复", //35-39 "云台控制命令发送", "系统出现未知错误", "录像文件大小", "配置端口号成功", "连接服务端成功", //40-44 "正在连接", "开始接收图象", "异常退出", "接收完毕,退出", "无法联系服务端", //45-49 "服务端拒绝访问", "无效", "停止客户端连接", "图像抓取成功", "初始化服务端网络连接成功", //50-54 "视频服务启动失败", "退出全屏预览", "", "", "" //55-59 }); //可以用新版函数替代功能或者无效的API //GetTotalChannels:可用GetEncodeChannelCount替代 //GetTotalDSPs:可用GetDspCount 替代 //SetupDateTime:4.0版本起无效 //HW_GetChannelNum:无效,请使用GetBoardDetail //HW_GetDeviceSerialNo:无效,请使用GetBoardDetail //HW_SetVideoOutStandard:无效,请使用SetDisplayStandard或SetDefaultVideoStandard //HW_SetDspDeadlockMsg:无效 //HW_ResetDsp:无效 //HW_SetDisplayPara:DISPLAY_PARA结构中bToVideoOut无效,MD卡模拟视频输出功能 //已经整合到视频矩阵之中。 #region 流类型宏定义 /// /// 视频流 /// #define STREAM_TYPE_VIDEO /// private const int STREAM_TYPE_VIDEO = 1; /// /// 音频流 /// #define STREAM_TYPE_AUDIO /// private const int STREAM_TYPE_AUDIO = 2; /// /// 音视频复合流 /// #define STREAM_TYPE_AVSYNC /// private const int STREAM_TYPE_AVSYNC = 3; #endregion #region 1.板卡初始化及卸载 /// /// 1.1初始化DSP InitDSPs /// 说 明: 初始化系统中每一块板卡,应在应用软件程序启动时完成。如果返回值为0则表 /// 明初始化失败,可能没有找到相应的DSP软件模块。 /// /// int __stdcall InitDSPs() /// /// 系统内可用的编码通道个数。 [DllImport("DS40xxSDK.dll")] public static extern int InitDSPs(); /// /// 1.2卸载DSP DeInitDSPs /// 说 明: 关闭每一块板卡上的功能,应在应用软件程序退出时调用。 /// /// int __stdcall DeInitDSPs() /// /// 0 [DllImport("DS40xxSDK.dll")] public static extern int DeInitDSPs(); #endregion #region 2.板卡信息获取 /// /// 2.1获取系统中板卡的张数GetBoardCount /// 说 明: 获取系统中所有板卡的张数,包含编码卡和解码卡。 /// /// unsigned int __stdcall GetBoardCount() /// /// 系统中板卡的总张数。 [DllImport("DS40xxSDK.dll")] public static extern uint GetBoardCount(); /// /// 2.2获取系统中DSP的个数GetDspCount /// 说 明: 获取系统中所有板卡的DSP的个数。 /// /// unsigned int __stdcall GetDspCount() /// /// 系统中DSP的总个数 [DllImport("DS40xxSDK.dll")] public static extern uint GetDspCount(); /// /// GetTotalDSPs:可用GetDspCount 替代 /// 获得实际可用DSP /// /// [DllImport("DS40xxSDK.dll")] public static extern int GetTotalDSPs(); /// /// 2.3获取系统中编码通道的个数GetEncodeChannelCount /// 说 明: 获取系统中所有编码卡的编码通道总个数,包含H系列和HC系列编码卡。 /// /// unsigned int __stdcall GetEncodeChannelCount() /// /// 系统中编码通道的个数 [DllImport("DS40xxSDK.dll")] public static extern uint GetEncodeChannelCount(); /// /// 2.4获取系统中解码通道的个数GetDecodeChannelCount /// 说 明: 获取系统中MD卡的解码通道个数 /// /// unsigned int __stdcall GetDecodeChannelCount() /// /// [DllImport("DS40xxSDK.dll")] public static extern uint GetDecodeChannelCount(); /// /// 2.5获取系统中解码显示通道的个数GetDisplayChannelCount /// 说 明: 获取系统中MD卡显示通道的个数,即模拟视频输出通道的个数 /// /// unsigned int __stdcall GetDisplayChannelCount() /// /// 系统中显示通道的个数 [DllImport("DS40xxSDK.dll")] public static extern uint GetDisplayChannelCount(); /// /// 2.6获取板卡详细信息GetBoardDetail /// 说 明: 获取某张板卡的详细信息 /// /// int __stdcall GetBoardDetail(UINT boardNum,DS_BOARD_DETAIL *pBoardDetail) /// /// 板卡索引 /// 板卡信息 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int GetBoardDetail(uint boardNum, ref DS_BOARD_DETAIL pBoardDetail); /// /// 2.7获取DSP详细信息GetDspDetail /// 说 明: 获取某个DSP的详细信息 /// /// int __stdcall GetDspDetail(UINT dspNum,DSP_DETAIL *pDspDetail) /// /// DSP索引 /// DSP信息 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int GetDspDetail(uint dspNum, ref DSP_DETAIL pDspDetail); /// /// 2.8获取板卡型号及序列号信息GetBoardInfo /// 说 明: 获取板卡的型号及序列号信息 /// /// int __stdcall GetBoardInfo(HANDLE hChannelHandle, UInt64 *BoardType, UCHAR *SerialNo) /// /// 通道句柄 /// 板卡型号 /// /// 板卡ID号, 内容为板卡序列号的ASCII的数值,次序为SerialNo[0] 对应最高位, /// SerialNo[11]对应最低位。比如卡号为“40000002345”的值对应为 4,0,0,0,0,1,0,0,2,3,4,5 的整形数组。 /// /// 成功为0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int GetBoardInfo(IntPtr hChannelHandle, UInt64 BoardType, byte[] SerialNo); /// /// 2.9获取板卡特殊功能信息GetCapability /// 说 明: 获取板卡特殊功能信息 /// /// int __stdcall GetCapability(HANDLE hChannelHandle, CHANNEL_CAPABILITY *Capability) /// /// 通道句柄 /// 特殊功能 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int GetCapability(IntPtr hChannelHandle, CHANNEL_CAPABILITY Capability); /// /// 2.10获取板卡SDK信息GetSDKVersion /// 说 明: 获取当前所使用的DSP、Driver、SDK版本号 /// /// int __stdcall GetSDKVersion(PVERSION_INFO VersionInfo) /// /// 版本信息 /// 成功返回0;失败返回错误号。 [DllImport("DS40xxSDK.dll")] public static extern int GetSDKVersion(ref PVERSION_INFO VersionInfo); /// /// 2.11获取板卡SDK及DSP错误报告GetLastErrorNum*,此函数只对H卡有效 /// 说 明: 获取SDK及DSP错误报告。此函数只对H卡有效,用于HC卡上返回0且无效 /// /// int __stdcall GetLastErrorNum(HANDLE hChannelHandle, UInt64 *DspError, UInt64 *SdkError) /// /// 通道句柄 /// DSP错误 /// SDK错误 /// DSP错误信息、SDK错误信息 [DllImport("DS40xxSDK.dll")] public static extern int GetLastErrorNum(IntPtr hChannelHandle, ref int DspError, ref int SdkError); #endregion #region 3.编码卡API #region 3.1通道打开及关闭 /// /// 3.1.1打开通道ChannelOpen /// 说 明: 打开通道,获取编码通道的操作句柄,与通道相关的操作需使用相对应的句柄。 /// /// HANDLE __stdcall ChannelOpen(int ChannelNum) /// /// 通道号(从0开始) /// 成功返回有效句柄(值可能为0);失败返回0xFFFFFFFF。 [DllImport("DS40xxSDK.dll")] public static extern IntPtr ChannelOpen(int ChannelNum); /// /// 3.1.2关闭通道ChannelClose /// 说 明: 关闭通道,释放相关资源 /// /// int __stdcall ChannelClose(HANDLE hChannelHandle) /// /// 通道句柄 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int ChannelClose(IntPtr hChannelHandle); #endregion #region 3.2视频预览 #region 3.2.1 Overlay预览模式 // 释 义: overlay预览模式 //Overlay通常被称为重叠页面或者是覆盖层,是一种需要特定的硬件支持的页面,通常 //被用于显示实时视频于主页面之上,而不需要Blit操作到主页面或用任何方法改变主页面的 //内容。使用该方式进行预览可以提高预览的画质和降低CPU利用率。 /// /// 3.2.1.1设置视频预览模式SetPreviewOverlayMode /// 说 明: SDK自3.2版本起在部分显卡中实现了HC卡以overlay方式预览的功能(此功 /// 能不支持与H卡混插的状态下),可以提高预览的画质和降低CPU利用率。当预览画面小 /// 于704*576时,需要调用该函数来启动overlay模式,如不设置则自动切换到offscreen模式 /// 进行预览显示,当预览画面大于704*576时,SDK自动切换到overlay模式 /// /// int __stdcall SetPreviewOverlayMode(BOOL bTrue) /// /// 是否设置overlay预览方式,也适用于MD卡 /// 0表示显卡支持板卡的overlay预览方式;其他值表示显卡不支持 [DllImport("DS40xxSDK.dll")] public static extern int SetPreviewOverlayMode(bool bTrue); /// /// 3.2.1.2设置overlay关键色SetOverlayColorKey /// 注意:需要在StartVideoPreview前调用该函数。 /// 说 明: 板卡在显示范围小于704*576时,调用SetPreviewOverlayMode可以开启overlay /// 预览模式,需调用SetOverlayColorKey设置overlay关键色;当显示范围大于704*576时, /// 板卡自动切换到overlay预览模式,关键色默认设置为RGB(10,10,10),也可调用 /// SetOverlayColorKey修改关键色。在这两种情况下,都需要将显示窗口的底色设置为和关键 /// 色相一致。否则图像将难以显示。 /// /// /// int __stdcall SetOverlayColorKey(COLORREF DestColorKey) /// /// overlay关键色参数(RGB(*,*,*)) /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetOverlayColorKey(int DestColorKey); //public static extern int SetOverlayColorKey(Color DestColorKey); /// /// 3.2.1.3恢复当前丢失的表面RestoreOverlay /// 说 明: 恢复当前丢失的表面,例如:当系统按下CTRL+ALT+DEL时系统的OVERLAY /// 表面会被强制关闭,调用该函数可以恢复OVERLAY表面 /// /// int __stdcall RestoreOverlay() /// /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int RestoreOverlay(); #endregion #region 3.2.2 开启及停止视频预览 /// /// 3.2.2.1开启视频预览StartVideoPreview /// 说 明: 启动视频预览,调用SetPreviewOverlayMode后,可进行overlay模式预览,否则, /// 将默认采用offscreen模式预览。当画面大于704*576时,SDK自动切换到overlay预览模式。 /// /// int __stdcall StartVideoPreview(HANDLE hChannelHandle,HWND WndHandle, RECT *rect,BOOLEAN bOverlay, int VideoFormat, int FrameRate) /// /// 通道句柄 /// 显示窗口句柄 /// /// 显示窗口内的矩形区域 /// Rect.right 必须为8的倍数 /// Rect.bottom必须为16的倍数 /// /// 是否启用Overlay预览模式 /// 视频预览格式(目前无效) /// 视频预览帧率(PAL:1-25,NTSC:1-30) /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int StartVideoPreview(IntPtr hChannelHandle, IntPtr WndHandle, ref Rectangle rect, bool bOverlay, int VideoFormat, int FrameRate); //public static extern int StartVideoPreview(IntPtr hChannelHandle, IntPtr WndHandle, ref RECT rect, bool bOverlay, int VideoFormat, int FrameRate); /// /// 3.2.2.2停止视频预览StopVideoPreview /// 说 明: 停止视频预览 /// /// int __stdcall StopVideoPreview(HANDLE hChannelHandle) /// /// 通道句柄 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int StopVideoPreview(IntPtr hChannelHandle); #endregion #region 3.2.3 视频参数的设置及获取 /// /// 3.2.3.1设置视频参数SetVideoPara /// 说 明: 设置视频参数 /// /// int __stdcall SetVideoPara(HANDLE hChannelHandle, int Brightness, int Contrast, int Saturation, int Hue) /// /// 通道句柄 /// 亮度值(0-255) /// 对比度(0-127) /// 饱和度(0-127) /// 色调(0-255) /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetVideoPara(IntPtr hChannelHandle, int Brightness, int Contrast, int Saturation, int Hue); /// /// 3.2.3.2获取视频参数GetVideoPara /// 说 明: 获取视频参数 /// /// int __stdcall GetVideoPara(HANDLE hChannelHandle, VideoStandard_t *VideoStandard, int*Brightness, int *Contrast, int *Saturation, int *Hue) /// /// 通道句柄 /// 视频制式 /// 亮度指针值(0-255) /// 对比度指针值(0-127) /// 饱和度指针值(0-127) /// 色调指针值(0-255) /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int GetVideoPara(IntPtr hChannelHandle, VideoStandard_t VideoStandard, out int Brightness, out int Contrast, out int Saturation, out int Hue); #endregion #endregion #region 3.3视频信号设置(制式、状况、输入位置等) /// /// 3.3.1设置视频制式SetVideoStandard,此函数只对H卡有效 /// 说 明: 设置视频制式,在某一制式的摄像头已经接好的情况下启动系统时可不必调用该 /// 函数,如果没有接摄像头的情况下启动系统然后再接NTSC制式的摄像头则必须调用该函 /// 数,或者中途调换不同制式的摄像头也必须调用该函数。 /// /// int __stdcall SetVideoStandard(HANDLE hChannelHandle, VideoStandard_t VideoStandard) /// /// 通道句柄 /// 视频制式 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetVideoStandard(IntPtr hChannelHandle, VideoStandard_t VideoStandard); /// /// 3.3.2设置系统默认的视频制式SetDefaultVideoStandard /// 注意:该函数只能在系统初始化(InitDSPs)之前运行,否则无效 /// 说 明: 设置系统默认的视频制式,系统中所有的视频输入通道如果无视频输入或者在系 /// 统启动的时候,通道会按照所设置的系统默认视频制式进行处理。 /// /// int __stdcall SetDefaultVideoStandard(VideoStandard_t VideoStandard) /// /// 视频制式,默认为PAL /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetDefaultVideoStandard(VideoStandard_t VideoStandard); /// /// 3.3.3设置视频信号灵敏度SetVideoDetectPrecision /// 说 明: 设置视频信号检测的灵敏度。如果视频信号的强度比较弱,或者信号通断的切换 /// 比较频繁,会出现“无视频信号”的提示字样,为了避免提示字样影响图像,可以更改视频 /// 信号检测的灵敏度。灵敏度取值越大,检测精度越低,出现“无视频信号”提示字样的频率 /// 越低。当将value值设置为0xffffffff时,将不会再出现“无视频信号”的提示字样。 /// /// int __stdcall SetVideoDetectPrecision(HANDLE hChannel,unsigned int value) /// /// 通道句柄 /// 灵敏度。取值范围:0-100,默认为20 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetVideoDetectPrecision(IntPtr hChannel, uint value); /// /// 3.3.4获取视频信号输入情况GetVideoSignal /// 说 明: 获取视频信号的输入情况,用于视频丢失报警 /// /// int __stdcall GetVideoSignal(HANDLE hChannelHandle) /// /// 通道句柄 /// 信号正常返回0;返回其他值说明信号异常或有错误 [DllImport("DS40xxSDK.dll")] public static extern int GetVideoSignal(IntPtr hChannelHandle); /// /// 3.3.5调整视频信号输入位置SetInputVideoPosition /// 说 明: 设置视频信号的输入位置。(x,y)为系统处理图像的左上角在摄像机输入的原 /// 始图像中的坐标,某些摄像机输入的图像在预览时可能在左边会有黑边,可以通过此函数进 /// 行调节,x必须设置为2的整数倍。(x,y)的取值和摄像机的型号有关,如果指定的值和 /// 摄像机的输入参数不匹配,可能会导致图像静止、水平垂直方向滚动或者黑屏,请谨慎使用。 /// /// int __stdcall SetInputVideoPosition(HANDLE hChannel,UINT x,UINT y) /// /// 通道句柄 /// X轴坐标,默认值为8 /// Y轴坐标,默认值为2 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetInputVideoPosition(IntPtr hChannel, uint x, uint y); /// /// 3.3.6设置反隔行变换及强度SetDeInterlace /// 说 明: 设置是否采用反隔行算法,已经采用反隔行时的强度 /// /// 释 义: 反隔行变换 /// 如果该通道的图像需要进行4CIF的预览或编码,此时的图像中会同时包含奇、偶两 /// 场的数据,由于奇场图像和偶场图像不同步,导致图像中运动的部分发生错位、边缘模糊, /// 此时需要对图像进行反隔行变换来去掉这种现象。如果用户能够确定使用的是逐行扫描格式 /// 的摄像机,或者主要应用在静止场景,此时可以关掉反隔行变换功能,或者降低强度,这样 /// 可以提高系统运行效率,并降低反隔行变换对图像质量带来的损失。 /// /// int __stdcall SetDeInterlace(HANDLE hChannelHandle,UINT mode,UINT level) /// /// 通道句柄 /// /// 0表示该通道不进行反隔行变换,此时level参数无效; /// 1表示使用旧的算法; /// 2表示使用默认算法(系统默认值)。 /// /// /// mode=1时有效,其它时无效。 /// 0-10,反隔行变换的强度逐渐加强,0最弱,对图像的损失最小,10最强,对图像的损失最大。 /// /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetDeInterlace(IntPtr hChannelHandle, uint mode, uint level); #endregion #region 3.4视频编码参数设置 // 释 义: 双编码功能(主、子通道) // 对一路视频图像进行两路视频编码,两路视频可以有不同的码流类型、不同分辨率、不 //同码率等。3.0版本对双编码功能做了增强,子通道的所有参数都可以任意设置。 //双编码中主通道和子通道唯一的区别在于:子通道占用的系统资源比主通道少,优先级 //比主通道低。当系统忙时,会尽量保证主通道编码,并先从子通道开始丢帧。由于占用资源 //少,因此可以利用子通道来实现多路高分辨率的非实时编码。例如:可以把DS-4000HC中 //的每个子通道全部设置为4CIF分辨率(SetSubStreamType),而不使用主通道编码,这样就 //可以实现全部通道的4CIF编码。在一般场景下,每路图像都可以达到15帧以上。 /// /// 3.4.1主、子通道切换SetupSubChannel /// 说 明: 配合双编码模式使用。当设置某个通道为双编码模式时,如主通道编码CIF,子 /// 通道编码QCIF,这时可对主/子通道分别设置某些参数。关键帧间隔、OSD、LOGO等参数 /// 对主/子通道是一样的;在设置帧率、量化系数、变码流/定码流模式、码流大小等参数时应 /// 调用此函数分别对主/子通道进行设置,缺省是对主通道进行设置 /// /// int __stdcall SetupSubChannel(HANDLE hChannelHandle, int iSubChannel) /// /// 通道句柄 /// 子通道号(0表示主通道,1表示主通道) /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetupSubChannel(IntPtr hChannelHandle, int iSubChannel); /// /// 3.4.2获取双编码时数据流类型GetSubChannelStreamType /// 说 明: 配合双编码模式使用,当设置双编码模式时,启动录像后,DSP会向上送两种 /// 数据流,调用此函数得到主通道和子通道的数据流类型,供应用程序使用。 /// /// int __stdcall GetSubChannelStreamType(void *DataBuf, int FrameType) /// /// 数据缓存区 /// 类型 /// /// 0 其他数据 /// 1 主通道数据流的文件头 /// 2 子通道数据流的文件头 /// 3 主通道数据流的视频帧类型 /// 4 子通道数据流的视频帧类型 /// 5 数据流的音频帧 /// [DllImport("DS40xxSDK.dll")] public static extern int GetSubChannelStreamType(IntPtr DataBuf, int FrameType); #region 3.4.3编码流类型的设置及获取(不支持动态修改) /// /// 3.4.3.1设置主通道编码流类型SetStreamType /// 说 明: 设置主通道编码流类型。此函数需在启动编码前进行设置 /// /// int __stdcall SetStreamType(HANDLE hChannelHandle, USHORT Type) /// /// 通道句柄 /// 类型 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetStreamType(IntPtr hChannelHandle, ushort Type); /// /// 3.4.3.2获取主通道编码流类型GetStreamType /// 说 明: 获取主通道编码流类型 /// /// int __stdcall GetStreamType(HANDLE hChannelHandle, USHORT *StreamType) /// /// 通道句柄 /// 类型 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int GetStreamType(IntPtr hChannelHandle, ref ushort StreamType); /// /// 3.4.3.3设置子通道编码流类型SetSubStreamType /// 说 明: 设置子通道编码流类型,此函数需在启动编码前进行设置 /// /// int __stdcall SetSubStreamType(HANDLE hChannelHandle, USHORT Type) /// /// 通道句柄 /// 类型 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetSubStreamType(IntPtr hChannelHandle, ref ushort Type); /// /// 3.4.3.4获取子通道编码流类型GetSubStreamType /// 说 明: 获取子通道编码流类型 /// /// int __stdcall GetSubStreamType(HANDLE hChannelHandle, USHORT *StreamType) /// /// 通道句柄 /// 类型 /// [DllImport("DS40xxSDK.dll")] public static extern int GetSubStreamType(IntPtr hChannelHandle, ref ushort StreamType); #endregion #region 3.4.4(支持动态修改)的编码参数设置 /// /// 3.4.4.1设置编码图像质量SetDefaultQuant /// 说 明: 设置图像量化系数,用于调整图像质量。量化系数越小图像质量越高。系统默认量化系数值为18,18,23。 /// 释 义: 量化系数 /// 量化系数是强烈影响MPEG标准中编码图像质量和码率的参数,当量化系数越低,图 /// 像质量就会越高,码率也就越高,反之,图形质量就会越低,码率也就越低 /// /// int __stdcall SetDefaultQuant(HANDLE hChannelHandle, int IQuantVal, int PQuantVal, int BQuantVal) /// /// 通道句柄 /// I帧量化系数,取值范围:12-30 /// P帧量化系数。取值范围:12-30(目前无效) /// B帧量化系数。取值范围:12-30(目前无效) /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetDefaultQuant(IntPtr hChannelHandle, int IQuantVal, int PQuantVal, int BQuantVal); /// /// 3.4.4.2设置编码帧结构、帧率SetIBPMode /// 说 明: 设置编码帧结构和帧率。支持动态修改 /// 释 义: 关键帧间隔 /// 关键帧为编码码流中采用帧内压缩的图像帧,其特点是图像清晰度好,但数据量大,通 /// 常作为帧间编码的原始参考帧。关键帧间隔是连续的帧间编码的帧个数,因H264(MPEG4) /// 编码是有损压缩,关键帧的个数会影响图像质量,因此关键帧的间隔需要合理设计。 /// /// int __stdcall SetIBPMode(HANDLE hChannelHandle, int KeyFrameIntervals, int BFrames, int PFrames, int FrameRate) /// /// 通道句柄 /// 关键帧间隔。取值范围1-400,系统默认为100 /// B帧数量,取值为0或者2,系统默认为2 /// P帧数量。目前暂取值无效 /// 帧率,帧率范围1-25(PAL)、1-30(NTSC) /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetIBPMode(IntPtr hChannelHandle, int KeyFrameIntervals, int BFrames, int PFrames, int FrameRate); #region 3.4.4.3设置编码分辨率 /// /// 3.4.4.3.1设置主通道分辨率SetEncoderPictureFormat /// 说 明: 设置主通道编码分辨率。支持动态修改。 /// /// int __stdcall SetEncoderPictureFormat(HANDLE hChannelHandle, PictureFormat_t PictureFormat) /// /// 通道句柄 /// 编码图像分辨率(4CIF、DCIF、2CIF、CIF、QCIF) /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetEncoderPictureFormat(IntPtr hChannelHandle, PictureFormat_t PictureFormat); /// /// 3.4.4.3.2设置子通道编码分辨率SetSubEncoderPictureFormat /// 说 明: 设置双编码模式时子通道的编码分辨率,支持动态修改。 /// /// int __stdcall SetSubEncoderPictureFormat(HANDLE hChannelHandle, PictureFormat_t PictureFormat) /// /// 子通道句柄 /// 子通道编码图像分辨率(4CIF、DCIF、2CIF、CIF、 QCIF) /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetSubEncoderPictureFormat(IntPtr hChannelHandle, PictureFormat_t PictureFormat); #endregion #region 3.4.4.4设置码率及码流控制模式 /// /// 3.4.4.4.1设置码流最大比特率SetupBitrateControl /// 说 明: 设置编码的最大比特率。设置为0时码流控制无效,设置为某一最大比特率时, /// 当编码码流超过该值时,DSP会自动调整编码参数来保证不超过最大比特率,当编码码流 /// 低于最大比特率时,DSP不进行干涉。调整误差<10% /// /// int __stdcall SetupBitrateControl(HANDLE hChannelHandle, UInt64 MaxBps) /// /// 通道句柄 /// 最大比特率。取值:10000以上 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetupBitrateControl(IntPtr hChannelHandle, Int32 MaxBps); /// /// 3.4.4.4.2设置码流控制方式SetBitrateControlMode /// 说 明: 设置编码码流控制方式。配合SetupBitrateControl使用。当设置为变码率(brVBR) /// 时,最大比特率将作为编码码流上限,由DSP在码流上限下自动控制码率,一般会自动回 /// 落到最低的状态(由设定的图像质量参数和关键帧间隔决定),能最大程度地降低带宽和存 /// 储空间,但存储容量一般难以估算;当设置为定码率(brCBR)时,以最大比特率作为编码 /// 码率参数恒定输出码流,不会自动回落到低码流状态,存储容量可根据设定码率的大小进行估算。 /// /// int __stdcall SetBitrateControlMode(HANDLE hChannelHandle, BitrateControlType_t brc) /// /// 通道句柄 /// 码流控制方式,分为变码率(brVBR)和恒定码率 (brCBR)两种方式 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetBitrateControlMode(IntPtr hChannelHandle, BitrateControlType_t brc); #endregion /// /// 3.4.5强制设定I帧CaptureIFrame /// 说 明: 将当前编码帧强制设定为I帧模式,可从码流中提取该帧单独用于网络传送。 /// /// int __stdcall CaptureIFrame(HANDLE hChannelHandle) /// /// 通道句柄 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int CaptureIFrame(IntPtr hChannelHandle); /// /// 3.4.6获取帧统计信息GetFramesStatistics /// 说 明: 获取帧统计信息 /// /// int __stdcall GetFramesStatistics(HANDLE hChannelHandle,PFRAMES_STATISTICS framesStatistics) /// /// 通道句柄 /// 帧统计信息 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int GetFramesStatistics(IntPtr hChannelHandle, PFRAMES_STATISTICS framesStatistics); #endregion #endregion #region 3.5数据捕获 #region 3.5.1抓图(获取单帧图像数据) #region 3.5.1.1抓取BMP格式图像 /// /// 3.5.1.1.1获取原始yuv422格式数据GetOriginalImage /// 说 明: 获得原始yuv422格式图像,DS4000HC原始图像是4CIF图像格式(包括QCIF编码), /// DS-4000HS原始图像为CIF图像格式,DS400xH卡的原始图象是CIF图象格式。 /// /// int __stdcall GetOriginalImage(HANDLE hChannelHandle, UCHAR *ImageBuf, UInt64 *Size) /// /// 通道句柄 /// 原始yuv422格式图像指针 /// 原始yuv422格式图像尺寸,函数调用前是ImageBuf的大小,调用后是实际图像所占用的字节数 /// 成功返回0,失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int GetOriginalImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size); /// /// 3.5.1.1.2图像格式转换YUVtoBMP SaveYUVToBmpFile /// 说 明: 用户程序可调用此函数来生成24位的bmp文件,如果是DS4000HC卡抓图则 /// Width 为704,Height 为576PAL/480NTSC,如果是DS400xH卡抓图则Width可能为352 /// 或176,Height为288、240、144或120,要根据缓冲区的大小来判断。 /// /// int __stdcall SaveYUVToBmpFile(char *FileName, unsigned char *yuv, int Width, int Height) /// /// 文件名 /// yuv422格式图像指针 /// 图像宽度 /// 图像高度 /// [DllImport("DS40xxSDK.dll")] public static extern int SaveYUVToBmpFile(string FileName, byte[] yuv, int Width, int Height); /// /// 3.5.1.2抓取JPEG格式图像GetJpegImage /// 说 明: 抓取JPEG格式图像 /// /// int __stdcall GetJpegImage(HANDLE hChannelHandle,UCHAR *ImageBuf, UInt64 *Size,UINT nQuality) /// /// 通道句柄 /// JPEG图像指针 /// JPEG图像尺寸,函数调用前是ImageBuf的大小,调用后是实际图像所占用的字节数 /// JPEG图像质量,取值范围1-100,取值100时质量最好 /// [DllImport("DS40xxSDK.dll")] public static extern int GetJpegImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size, uint nQuality); #endregion #region 3.5.2原始图像数据流捕获(获取YUV420格式数据流) /// /// 3.5.2.1注册原始图像数据流回调函数RegisterImageStreamCallback /// 说 明: 注册获取原始图像数据流函数,用户可以获取实时的YUV420格式的预览数据 /// /// int __stdcall RegisterImageStreamCallback (IMAGE_STREAM_CALLBACK ImageStreamCallback,void *context) /// /// 原始图像数据流回调函数 /// 设备上下文 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int RegisterImageStreamCallback(IMAGE_STREAM_CALLBACK ImageStreamCallback, IntPtr context); /// /// 3.5.2.2开启及停止原始数据流捕获SetImageStream /// 说明: 开启或停止原始图像数据流捕获,此函数依赖主机的处理速度。DS-4000HS只能捕获不大于CIF格式的数据流 /// /// 函 数: int __stdcall SetImageStream(HANDLE hChannel,BOOL bStart,UINT fps, UINT width,UINT height,unsigned char *imageBuffer) /// /// 通道句柄 /// 是否启动捕获 /// 帧率 /// 图像宽度,必须是4CIF宽度的1/8,1/4,1/2或原始大小704 /// 图象高度,必须是4CIF高度的1/8,1/4,1/2或原始大小576PAL/480NTSC /// 数据存储缓存 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetImageStream(IntPtr hChannel, bool bStart, uint fps, uint width, uint height, char[] imageBuffer); #endregion #region 3.5.3编码数据流捕获(获取编码后H.264格式数据流)即录像 //注意:注册直接回调或者消息回调后,需要启动编码数据流捕获函数才能进行数据回调。三 //种数据回调方式,只需选取其中一种使用即可。对于HC系列板卡(包括HC、HC+、HCS、 //HS),推荐使用第一种读取方式。对于H系列板卡,只能使用后两种读取方式。 #region 3.5.3.1编码数据流捕获方式设置 /// /// 3.5.3.1.1.1注册编码图像数据流直接读取回调函数 /// 说 明: DS4000HC系列板卡新增的一种数据流读取方式,当启动数据捕获后, /// StreamDirectReadCallback会提供数据流的地址、长度、帧类型等,供用户程序直接处理。 /// /// 函 数: int __stdcall RegisterStreamDirectReadCallback (STREAM_DIRECT_READ_CALLBACK StreamDirectReadCallback,void *Context) /// /// 编码数据流直接读取回调函数 /// 设备上下文 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int RegisterStreamDirectReadCallback(STREAM_DIRECT_READ_CALLBACK StreamDirectReadCallback, IntPtr context); #endregion #region 3.5.3.1.2方式二、消息读取方式 /// /// 3.5.3.1.2.1设置消息读取伐值,此函数只对H卡有效 /// 说 明: 设置消息读取的伐值,可以将缓冲区的数据在OnDataReady中一次性取走 /// /// int __stdcall SetupNotifyThreshold(HANDLE hChannelHandle, int iFramesThreshold) /// /// 通道句柄 /// 读取消息伐值,范围1-10 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int SetupNotifyThreshold(IntPtr hChannelHandle, int iFramesThreshold); /// /// 3.5.3.1.2.2注册消息读取码流函数 /// 说 明: 当数据准备好时,SDK会向hWnd窗口发送MessageId消息,目标窗口收到 /// Message后调用ReadStreamData读取一帧数据。如果HC卡与H卡混插,可以先调用 /// RegisterStreamDirectReadCallback函数来注册HC卡取码流回调函数,再调用 /// RegisterMessageNotifyHandle函数来注册H卡取码流消息函数。 /// HC系列板卡建议使用方式一进行数据捕获。 /// /// int __stdcall RegisterMessageNotifyHandle(HWND hWnd, UINT MessageId) /// /// 通道句柄 /// 自定义消息 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int RegisterMessageNotifyHandle(IntPtr hWnd, uint MessageId); #endregion #region 3.5.3.1.3方式三、另一种直接读取方式 /// /// 3.5.3.1.3.1注册直接读取码流回调函数 /// 说 明: 另一种数据流读取方式 /// /// int __stdcall RegisterStreamReadCallback (STREAM_READ_CALLBACK StreamReadCallback, void *Context) /// /// 直接读取码流回调函数 /// 设备上下文 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int RegisterStreamReadCallback(STREAM_READ_CALLBACK StreamReadCallback, IntPtr Context); #endregion /// /// 3.5.3.2读取码流函数 /// 说 明: 读指定长度的数据流,适用于方式二及方式三。当调用StartVideoCapture 或 /// StartMotionDetection后,SDK线程会向已注册的用户窗口消息处理函数发送指定的消息, /// 并提供消息来源的通道号。当用户程序收到该消息时,可调用本函数来读取数据,Length 在 /// 作为输入时必须提供缓冲的大小,ReadStreamData会判断缓冲是否足够,如果缓冲足够大 /// 则返回值为当前的读取的帧长度,否则返回错误。 /// 在HC卡中,如果已经先调用了RegisterStreamDirectReadCallback()函数,则不需调用 /// ReadStreamData来读取数据,因为音视频数据会在RegisterStreamDirectReadCallback所注册 /// 的回调函数中直接返回。 /// /// int __stdcall ReadStreamData(HANDLE hChannelHandle, void *DataBuf, DWORD *Length, int *FrameType) /// /// 通道句柄 /// 自定义的数据缓存区 /// 输入:缓存区的大小;输出:一帧数据的大小 /// 类型 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int ReadStreamData(IntPtr hChannelHandle, byte[] DataBuf, out UInt64 Length, out int FrameType); #region 3.5.3.3开启及停止录像 /// /// 3.5.3.3.1启动主通道编码数据流捕获 /// 说 明: 启动主通道编码数据流捕获。用户程序可以使用直接读取方式,使用 /// StreamDirectReadCallback回调函数直接对数据流进行处理;也可以与H卡一样,通过消息 /// 读取方式,等SDK向用户程序发送在RegisterMessageNotifyHandle中注册的消息,用户程 /// 序使用ReadStreamData来读取数据流。 /// /// int __stdcall StartVideoCapture(HANDLE hChannelHandle) /// /// 通道句柄 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int StartVideoCapture(IntPtr hChannelHandle); /// /// 3.5.3.3.2停止主通道编码数据流捕获 /// 说 明: 停止主通道编码数据流捕获 /// /// int __stdcall StopVideoCapture(HANDLE hChannelHandle) /// /// 通道句柄 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int StopVideoCapture(IntPtr hChannelHandle); /// /// 3.5.3.3.3启动子通道编码数据流捕获 /// 说 明: 启动子通道编码数据流捕获 /// /// int __stdcall StartSubVideoCapture(HANDLE hChannelHandle) /// /// 通道句柄 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int StartSubVideoCapture(IntPtr hChannelHandle); /// /// 3.5.3.3.4停止子通道编码数据流捕获 /// 说 明: 停止子通道编码数据流捕获 /// /// int __stdcall StopSubVideoCapture(HANDLE hChannelHandle) /// /// 通道句柄 /// 成功返回0;失败返回错误号 [DllImport("DS40xxSDK.dll")] public static extern int StopSubVideoCapture(IntPtr hChannelHandle); #endregion #endregion #endregion #endregion #region 3.6移动侦测 // 释 义: 移动侦测 //DS4000HC提供运动强度信息来处理运动检测,设置移动侦测区域时以32*32像素块为 //单位,按4CIF(704*576)分辨率计算,每行有22个块(704/32),PAL时18行(576/32), //NTSC时15行(480/32),与编码格式无关。经过测试,这种方法比H卡提高了灵敏度和可 //靠性,并简化了返回的数据,返回的值是18个DWORD,对应屏幕高度576/32=18行(PAL), //每个DWORD的0-21位对应屏幕宽度704/32=22, 其中1为运动,0为静止,也可以调用原有 //MotionAnalyzer分析结果 //4.0版本的SDK新增了接口函数SetupMotionDetectionEx,

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧