BitBlt屏幕截图无法在Windows 10上运行

Ima*_*mac 24 c# windows windows-10

我正在使用此代码在后台捕获进程窗口:

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 Pro版本中发生了哪些变化?

谢谢!

use*_*241 1

希望这能解决问题。.net 框架中内置了一种可能有效的捕获屏幕的方法。不确定它是否会捕获 DirectX 内容,但可能值得一试。

请注意,此解决方案捕获当前屏幕,但您可能可以修改它以仅捕获您感兴趣的区域。

我在这里找到了这个解决方案:https://www.c-sharpcorner.com/UploadFile/2d2d83/how-to-capture-a-screen-using-C-Sharp/

private void CaptureMyScreen()
{
      try
      {
           //Creating a new Bitmap object
          Bitmap captureBitmap = new Bitmap(1024, 768, PixelFormat.Format32bppArgb);

         //Bitmap captureBitmap = new Bitmap(int width, int height, PixelFormat);
         //Creating a Rectangle object which will  
         //capture our Current Screen
         Rectangle captureRectangle = Screen.AllScreens[0].Bounds;

         //Creating a New Graphics Object
         Graphics captureGraphics = Graphics.FromImage(captureBitmap);

        //Copying Image from The Screen
        captureGraphics.CopyFromScreen(captureRectangle.Left,captureRectangle.Top,0,0,captureRectangle.Size);

        //Saving the Image File (I am here Saving it in My E drive).
        captureBitmap.Save(@"E:\Capture.jpg",ImageFormat.Jpeg);

        //Displaying the Successfull Result

        MessageBox.Show("Screen Captured");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
Run Code Online (Sandbox Code Playgroud)