当尝试使用DXGI捕获笔记本电脑上的内置屏幕时,出现以下错误,该笔记本电脑在具有最新驱动程序的Intel 630 HD上运行。当我捕获GTX 1070上运行的外部屏幕时,该代码有效。
SharpDX.SharpDXException HResult=0x80070057 Message=HRESULT: [0x80070057], Module: [General], ApiCode: [E_INVALIDARG/Invalid Arguments], Message: The parameter is incorrect.
我表格中的代码:
desktopDuplicator = new DesktopDuplicatorD11(1,0, DesktopDuplicatorD11.VSyncLevel.None);
错误的代码部分:
private bool RetrieveFrame() { if (desktopImageTexture == null) desktopImageTexture = new Texture2D(mDevice, mTextureDescription); frameInfo = new OutputDuplicateFrameInformation(); try { mDeskDuplication.AcquireNextFrame(500, out frameInfo, out desktopResource); } catch (SharpDXException ex) { if (ex.ResultCode.Code == SharpDX.DXGI.ResultCode.WaitTimeout.Result.Code) { return true; } if (ex.ResultCode.Failure) { throw new DesktopDuplicationException("Failed to acquire next frame."); } } using (var tempTexture = desktopResource.QueryInterface<Texture2D>()) { mDevice.ImmediateContext.CopyResource(tempTexture, desktopImageTexture); } return false; }
特别是在行上错误:
desktopImageTexture = new Texture2D(mDevice, mTextureDescription);
使用内部显示器和Intel 630时是什么原因引起的错误?
编辑#1:mTextureDescription创建:
this.mTextureDescription = new Texture2DDescription() { CpuAccessFlags = CpuAccessFlags.Read, BindFlags = BindFlags.None, Format = Format.B8G8R8A8_UNorm, Width = this.mOutputDescription.DesktopBounds.Right, Height = this.mOutputDescription.DesktopBounds.Bottom, OptionFlags = ResourceOptionFlags.None, MipLevels = 1, ArraySize = 1, SampleDescription = { Count = 1, Quality = 0 }, Usage = ResourceUsage.Staging };
整个桌面复制过程在同一线程上完成。
更新#2:在Intel 630上,Width = this.mOutputDescription.DesktopBounds.Right,
返回0,而在我的1070上,它返回1920。
当尝试使用DXGI捕获笔记本电脑上的内置屏幕时,出现以下错误,该笔记本电脑在具有最新驱动程序的Intel 630 HD上运行。当我捕获运行中的外部屏幕时,该代码有效。
首先,要从API获得有关无效参数的提示(这正是您所拥有的),您需要enable Direct3D Debug Layer。本文针对C ++进行了解释,并且也可以使用C#做类似的技巧。