Windows7 Winapi Image返回黑色clientrect

时间:2015-04-14 14:19:55

标签: c# winapi gdi image-capture

我在捕获另一个进程的图形时遇到问题,因为对于某些用户来说,它只是我捕获的纯黑屏。不幸的是,我不知道为什么只为某些用户发生这种情况。我直接使用子窗口而不是窗口句柄,我通过发布windowhandle的地址并用spy ++检查这个窗口句柄实际上是正确的来确保。

const string className = "BlueStacksApp";
  const string windowName = "_ctl.Window";

processMainHWND = process.MainWindowHandle;
    clientRectangleHandle = User32.FindWindowEx(processMainHWND, 0, className, windowName);

internal Bitmap MakeSnapshot(IntPtr AppWndHandle, RECT rect)
  {
   int width = rect.right - rect.left;
   int height = rect.bottom - rect.top;

   IntPtr hdcTo = IntPtr.Zero;
   IntPtr hdcFrom = IntPtr.Zero;
   IntPtr hBitmap = IntPtr.Zero;
   try
   {
    Bitmap clsRet = null;

    // get device context of the window...
    hdcFrom = User32.GetWindowDC(AppWndHandle);

    // create dc that we can draw to...
    hdcTo = GDI32.CreateCompatibleDC(hdcFrom);
    hBitmap = GDI32.CreateCompatibleBitmap(hdcFrom, width, height);


    //  validate
    if (hBitmap != IntPtr.Zero)
    {
     // adjust and copy

     IntPtr hLocalBitmap = GDI32.SelectObject(hdcTo, hBitmap);
     bool result = GDI32.BitBlt(hdcTo, 0, 0, width, height, hdcFrom, 0, 0, GDI32.SRCCOPY);

     GDI32.SelectObject(hdcTo, hLocalBitmap);
     //  create bitmap for window image...
     clsRet = Image.FromHbitmap(hBitmap);
    }
    return clsRet;
   }
   finally
   {
    //  release the unmanaged resources
    if (hdcFrom != IntPtr.Zero)
     User32.ReleaseDC(AppWndHandle, hdcFrom);
    if (hdcTo != IntPtr.Zero)
     GDI32.DeleteDC(hdcTo);
    if (hBitmap != IntPtr.Zero)
     GDI32.DeleteObject(hBitmap);
   }
  }

0 个答案:

没有答案