C# 无重叠捕获

C# 无重叠捕获,c#,.net,winapi,gdi,image-capture,C#,.net,Winapi,Gdi,Image Capture,我有一个.NET控件,它通过非托管代码输出视频 我想捕获控制客户端区域(视频帧) 方法Control.DrawToBitmap不起作用,它输出控件背景-灰色 然后我尝试使用GDI的BitBlt: 它可以工作,但问题是它捕获了所有控件,甚至是捕获到的控件上的控件 我想捕获控制客户机区域,即使它是重叠的。它是如何实现的?这应该是可行的,但我已经有一段时间没有用winforms编写代码了。。。如果不行的话,我也许可以重新创造它 而不是 Graphics graphic = captureBox.Cre

我有一个.NET控件,它通过非托管代码输出视频

我想捕获控制客户端区域(视频帧)

方法Control.DrawToBitmap不起作用,它输出控件背景-灰色

然后我尝试使用GDI的BitBlt:

它可以工作,但问题是它捕获了所有控件,甚至是捕获到的控件上的控件

我想捕获控制客户机区域,即使它是重叠的。它是如何实现的?

这应该是可行的,但我已经有一段时间没有用winforms编写代码了。。。如果不行的话,我也许可以重新创造它

而不是

Graphics graphic = captureBox.CreateGraphics();
IntPtr dc1 = graphic.GetHdc();


另外请注意,如果这会给您灰色背景,则可能意味着非托管代码不会呈现在您的窗口中,而是呈现在它上面创建的另一个窗口中。你可以找出spy++是否是这种情况。

你使用的是D3DImage还是其他东西?尝试使用
SRCCOPY | CAPTUREBLT
@Chris O它也不起作用,重叠仍然与控件一起捕获。实际上,我看不出直接使用GDI P/Invokes与仅包装这些GDI P/Invokes的.NET版本之间有什么区别。通过Spy++进行检查是个不错的主意,但不幸的是没有额外的窗口,即视频直接渲染到.NET控件中。同样奇怪的是,有时捕获视频,有时捕获灰色背景,就好像在渲染视频时没有发生窗口失效。我还尝试使用PrintWindow API,它的行为方式相同(主要是灰色背景,有时是视频),但它解决了重叠问题。这可能是对的,它在绘制视频时不会使窗口无效。但是当PictureBox的WndProc收到一条绘画信息时,它会用“适当的”内容重新绘制,就其而言,这是灰色背景。子类PictureBox并添加您自己对WM_PAINT和/或WM_NCPAINT的处理,这可能使其始终返回视频。
Graphics graphic = captureBox.CreateGraphics();
IntPtr dc1 = graphic.GetHdc();
[DllImport("gdi32.dll")]
private static extern IntPtr GetDC(IntPtr hWnd)
[DllImport("gdi32.dll")]
private static extern int ReleaseDc(IntPtr hWnd, IntPtr hDc)
// ...

IntPtr dc1 = GetDc(captureBox.Handle);
// ...
ReleaseDc(captureBox.Handle,dc1);