private int GetMoveRects(int bufferSizeBytes, out OutputDuplicateMoveRectangle[] moveRects) { int moveRectsBufferSizeRequired = 0; moveRects = new OutputDuplicateMoveRectangle[0]; if (bufferSizeBytes <= 0) { return(moveRectsBufferSizeRequired); } var moveItemSize = Marshal.SizeOf(typeof(OutputDuplicateMoveRectangle)); var maxMoveRectItemCount = bufferSizeBytes / moveItemSize; if (maxMoveRectItemCount > 0) { var moveRectBuf = new OutputDuplicateMoveRectangle[maxMoveRectItemCount]; try { deskDupl.GetFrameMoveRects(bufferSizeBytes, moveRectBuf, out moveRectsBufferSizeRequired); } catch (SharpDXException ex) { if (ex.ResultCode == SharpDX.DXGI.ResultCode.MoreData) { logger.Error(ex); // TODO: //maxMoveRectItemCount = moveRectsBufferSizeRequired / moveItemSize; //moveRectBuf = new OutputDuplicateMoveRectangle[maxMoveRectItemCount]; // continue... } throw; } var moveCount = moveRectsBufferSizeRequired / moveItemSize; if (moveCount > 0) { if (maxMoveRectItemCount > moveCount) { moveRects = moveRectBuf.Take(moveCount).ToArray(); } else { moveRects = moveRectBuf; } } } return(moveRectsBufferSizeRequired); }