/// <summary> /// 获取开窗 /// </summary> /// <param name="info">窗口操作信息</param> /// <param name="struWinCfg">窗口信息</param> /// <param name="struWinParamCfg">窗口其他信息</param> /// <returns>TRUE:成功 FALSE:失败</returns> public static bool WallGetWinCfg(ref WinCtrlInfo info, ref NET_DVR_VIDEOWALLWINDOWPOSITION struWinCfg, ref NET_DVR_WALLWINPARAM struWinParamCfg) { uint m_dwWallNo = info.WallNo; uint m_dwRes = 0; uint m_dwWinNo = info.WinNo; //窗口号(组合):1字节电视墙号+1字节保留+2字节窗口号 uint dwWinNum = ((m_dwWallNo & 0xff) << 24) + ((m_dwRes & 0xff) << 16) + (m_dwWinNo & 0xff); IntPtr lpInBuffer = Marshal.AllocHGlobal(4); Marshal.StructureToPtr(dwWinNum, lpInBuffer, false); //窗口参数 struWinCfg = new NET_DVR_VIDEOWALLWINDOWPOSITION(); Int32 nSize = Marshal.SizeOf(struWinCfg); IntPtr lpOutBuffer = Marshal.AllocHGlobal(nSize); Marshal.StructureToPtr(struWinCfg, lpOutBuffer, false); //状态参数 UInt32 dwStatusList = 0; IntPtr lpStatusList = Marshal.AllocHGlobal(4); Marshal.StructureToPtr(dwStatusList, lpStatusList, false); bool b = false; if (!NET_DVR_GetDeviceConfig(info.UserId, NET_DVR_GET_VIDEOWALLWINDOWPOSITION, 1, lpInBuffer, 4, lpStatusList, lpOutBuffer, (UInt32)nSize)) { iLastErr = NET_DVR_GetLastError(); strErr = "NET_DVR_WALLWIN_GET failed, error code= " + iLastErr; //获取窗口参数失败,输出错误号 Failed to set the window parameters of device and output the error code return(false); } else { struWinCfg = (NET_DVR_VIDEOWALLWINDOWPOSITION)Marshal.PtrToStructure(lpOutBuffer, typeof(NET_DVR_VIDEOWALLWINDOWPOSITION)); //窗口在电视墙上的坐标位置 b = WallGetWinParam(ref info, ref struWinParamCfg); } Marshal.FreeHGlobal(lpInBuffer); Marshal.FreeHGlobal(lpOutBuffer); Marshal.FreeHGlobal(lpStatusList); return(b); }
/// <summary> /// 获取所有窗口号 /// </summary> /// <param name="lUserID">用户id</param> /// <param name="byWallNo">电视墙号</param> /// <param name="dwWinNo">输出分屏数量</param> /// <returns>返回窗口信息数组</returns> public static NET_DVR_VIDEOWALLWINDOWPOSITION[] GetAllWinInfo(int lUserID, int byWallNo, ref uint[] dwWinNo) { dwWinNo = new uint[MAX_VM_WIN_NUM * 16]; int iWinCount = 0; int iRet = 0; NET_DVR_VIDEOWALLWINDOWPOSITION pTemp = new NET_DVR_VIDEOWALLWINDOWPOSITION();//[MAX_WALL_WIN_COUNT * Marshal.SizeOf(new NET_DVR_VIDEOWALLWINDOWPOSITION())]; Int32 nSize = 4 + Marshal.SizeOf(pTemp); IntPtr lpOutBuffer = Marshal.AllocHGlobal(nSize); Marshal.StructureToPtr(pTemp, lpOutBuffer, false); IntPtr pt = new IntPtr(); uint dwCount = (uint)(4 + MAX_WALL_WIN_COUNT * Marshal.SizeOf(new NET_DVR_VIDEOWALLWINDOWPOSITION())); int dwWallNo = byWallNo; dwWallNo <<= 24; if (!NET_DVR_GetDeviceConfig(lUserID, NET_DVR_GET_VIDEOWALLWINDOWPOSITION, 0xffffffff, (IntPtr)dwWallNo, 4, IntPtr.Zero, lpOutBuffer, (UInt32)nSize)) { iRet = HikOperate.GetLastError(); return(new NET_DVR_VIDEOWALLWINDOWPOSITION[0]); } else { NET_DVR_VIDEOWALLWINDOWPOSITION lpWinPos1 = (NET_DVR_VIDEOWALLWINDOWPOSITION)Marshal.PtrToStructure(lpOutBuffer, typeof(NET_DVR_VIDEOWALLWINDOWPOSITION)); NET_DVR_VIDEOWALLWINDOWPOSITION[] lpWinPos = (NET_DVR_VIDEOWALLWINDOWPOSITION[])Marshal.PtrToStructure(pt, typeof(NET_DVR_VIDEOWALLWINDOWPOSITION[])); int dwWinCount = lpWinPos.Length; //= pt; for (int i = 0; i < dwWinCount; i++) { int iSubMode = GetSubWinInfo(lUserID, lpWinPos[i].dwWindowNo); if (iSubMode == -1) { dwWinNo[iWinCount++] = lpWinPos[i].dwWindowNo; continue; } for (int j = 0; j < iSubMode; j++) { dwWinNo[iWinCount++] = (uint)(((j + 1) << 16) + lpWinPos[i].dwWindowNo); } ; } iRet = iWinCount; } return(null); }
/// <summary> /// 开窗设置 /// </summary> /// <param name="info">窗口操作信息</param> /// <returns>TRUE:成功 FALSE:失败</returns> public static bool WallSetWinCfg(WinCtrlInfo info) { NET_DVR_VIDEOWALLWINDOWPOSITION m_struWinCfg = new NET_DVR_VIDEOWALLWINDOWPOSITION(); uint m_dwWallNo = info.WallNo; uint m_dwRes = 0; uint m_dwWinNo = info.WinNo; //窗口号(组合):1字节电视墙号+1字节保留+2字节窗口号 uint dwWinNum = ((m_dwWallNo & 0xff) << 24) + ((m_dwRes & 0xff) << 16) + (m_dwWinNo & 0xff); /////////////////////////////////////////////////////////////////////////////// //输入参数 NET_DVR_IN_PARAM struInputParam = new NET_DVR_IN_PARAM(); IntPtr lpBuf = Marshal.AllocHGlobal(4); Marshal.StructureToPtr(dwWinNum, lpBuf, false); struInputParam.struCondBuf.pBuf = lpBuf; //输入参数缓冲区,开窗的电视墙号,窗口号由设备自动分配 struInputParam.struCondBuf.nLen = 4; //窗口参数,包括使能、位置坐标等 m_struWinCfg.dwSize = (uint)Marshal.SizeOf(m_struWinCfg); m_struWinCfg.byEnable = info.IsEnable; m_struWinCfg.struRect.dwXCoordinate = ushort.Parse((info.IndexX * winBaseX).ToString()); m_struWinCfg.struRect.dwYCoordinate = ushort.Parse((info.IndexY * winBaseY).ToString()); m_struWinCfg.struRect.dwWidth = winBaseX; m_struWinCfg.struRect.dwHeight = winBaseY; Int32 nSize = Marshal.SizeOf(m_struWinCfg); IntPtr lpInBuf = Marshal.AllocHGlobal(nSize); Marshal.StructureToPtr(m_struWinCfg, lpInBuf, false); struInputParam.struInParamBuf.pBuf = lpInBuf; //输入参数缓冲区,开窗的窗口参数 struInputParam.struInParamBuf.nLen = (uint)nSize; struInputParam.dwRecvTimeOut = 0; //数据接收超时时间,0表示接口默认超时 ///////////////////////////////////////////////////////////////////////////// //输出参数 NET_DVR_OUT_PARAM struOutParam = new NET_DVR_OUT_PARAM(); //输出参数缓冲区,dwCount个窗口号(组合),dwCount为0 IntPtr lpOutBuf = Marshal.AllocHGlobal(4); Marshal.StructureToPtr(dwWinNum, lpOutBuf, false); struOutParam.struOutBuf.pBuf = lpOutBuf; struOutParam.struOutBuf.nLen = 4; //状态参数 UInt32 dwStatusList = 0; IntPtr lpStatusList = Marshal.AllocHGlobal(4); Marshal.StructureToPtr(dwStatusList, lpStatusList, false); bool b = NET_DVR_SetDeviceConfigEx(info.UserId, NET_DVR_SET_VIDEOWALLWINDOWPOSITION, 1, ref struInputParam, ref struOutParam); if (!b) { iLastErr = NET_DVR_GetLastError(); strErr = "NET_DVR_SET_VIDEOWALLWINDOWPOSITION failed, error code= " + iLastErr; //设置窗口参数失败,输出错误号 Failed to set the window parameters of device and output the error code } Marshal.FreeHGlobal(lpBuf); Marshal.FreeHGlobal(lpInBuf); Marshal.FreeHGlobal(lpOutBuf); Marshal.FreeHGlobal(lpStatusList); return(b); }