Windows7 Winapi Image возвращает черный clientrect

У меня проблема с захватом графики другого процесса, потому что для некоторых пользователей это просто черный экран, который я захватываю. К сожалению, я понятия не имею, почему это происходит только для некоторых пользователей. Я использую вспомогательное окно напрямую вместо дескриптора окна, и я гарантировал, отправив адрес дескриптора окна и проверив с помощью 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);
   }
  }

person kentor    schedule 14.04.2015    source источник
comment
Вы видели этот ответ? Проблема захвата окна с помощью winAPI BitBlt только для некоторых приложений Несмотря на то, что это Python, это звучит как похожая проблема, и ответ содержит множество хорошие детали.   -  person ZaXa    schedule 14.04.2015
comment
Спасибо за этот совет, я собираюсь попробовать предложенные подходы   -  person kentor    schedule 14.04.2015
comment
Сделай мне одолжение и дай мне знать, если это поможет. Я тоже делаю массу вещей с GDI и еще не достиг этого, но, похоже, в конечном итоге я это сделаю.   -  person ZaXa    schedule 14.04.2015
comment
На данный момент режим композитинга исправил это, но я не могу его использовать, потому что он делает странные вещи, например, исчезает мой процесс, из которого я захватываю изображения. я все еще пытаюсь   -  person kentor    schedule 14.04.2015
comment
Вы также начнете получать клипы с перекрывающимися окнами и тому подобное в некоторых режимах. Это сложно.   -  person ZaXa    schedule 14.04.2015
comment
Мне все равно нужно заставить его работать с моим текущим решением :/. В противном случае мне потребуется как минимум 2 недели, чтобы изменить его на другой метод захвата.   -  person kentor    schedule 14.04.2015
comment
Имейте в виду, что процесс может вызывать SetWindowDisplayAffinity и предотвратить захват содержимого экрана другим процессом.   -  person IInspectable    schedule 14.04.2015
comment
Для всех, кому интересно, я попробовал это решение: github.com/spazzarama/Direct3DHook, и оно показало мне правильное содержание. Сейчас пытаюсь адаптировать его к своему проекту. Спасибо и за ваши комментарии. Закса мне очень помог!   -  person kentor    schedule 14.04.2015