我正在使用此代码在后台捕获进程窗口:
IntPtr = Process.GetProcessByName("memu")[0].MainWindowHandle;
RECT rc;
GetClientRect(hwnd, out rc);
IntPtr hdcFrom = GetDC(hwnd);
IntPtr hdcTo = CreateCompatibleDC(hdcFrom);
int Width = rc.right;
int Height = rc.bottom;
Bitmap bmp = null;
IntPtr hBitmap = CreateCompatibleBitmap(hdcFrom, Width, Height);
if (hBitmap != IntPtr.Zero) {
IntPtr hLocalBitmap = SelectObject(hdcTo, hBitmap);
BitBlt(hdcTo, 0, 0, Width, Height, hdcFrom, 0, 0, CopyPixelOperation.SourceCopy);
SelectObject(hdcTo, hLocalBitmap);
DeleteDC(hdcTo);
ReleaseDC(hwnd, hdcFrom);
bmp = Image.FromHbitmap(hBitmap);
DeleteObject(hBitmap);
return bmp;
}
Run Code Online (Sandbox Code Playgroud)
这段代码捕获了一个名为MEmu的Android模拟器,它使用DirectX来呈现内容.但是这个代码在Windows 10更新到16299版之后停止工作(之前它正常工作),它仍然在启用了Aero模式的Windows 7上运行.
当我在Windows 10 Pro v16299.X中使用此方法时,它只返回一个白色图像,或者它返回模拟器"加载屏幕",而不是正在运行的内容.在Windows 7上,如果我删除Aero模式,它将采取相同的行动,捕获"加载屏幕",因此看起来像新的Windows 10专业版更新中的透明度工作方式.
我已经尝试了一切,尝试安装一些模块以强制Aero Mode在Windows 10上工作,尝试使用PrintWindow在后台捕获屏幕,但仍然是相同的.
有什么想法会发生什么?还是可能的解决方案?或者在最后一个可能破坏该代码的Windows 10 …