Почему SendMessage возвращает пустой Bitmap?
От: objMihail Россия  
Дата: 17.10.10 10:07
Оценка:
Нужно получить картинку формы под фокусом. Хендл этого окна (Handle) и его размеры (Width, Height) я успешно нахожу, а дальше использую следующий код для получения, собственно, картинки:
  using (Bitmap bm = new Bitmap(Width + 2, Height + 2))
  {
    using (Graphics g = Graphics.FromImage(bm))
    {
      IntPtr dc = g.GetHdc();
      try
      {
        SendMessage(Handle, WM_PRINT, dc,
         DrawingOptions.PRF_CHILDREN |
         DrawingOptions.PRF_CLIENT |
         DrawingOptions.PRF_NONCLIENT);
      }
      finally
      {
       g.ReleaseHdc(dc);
      }
      bm.Save("bm.png");
    }
  }



[Flags]
private enum DrawingOptions
{
  PRF_CHECKVISIBLE = 0x00000001,
  PRF_NONCLIENT = 0x00000002,
  PRF_CLIENT = 0x00000004,
  PRF_ERASEBKGND = 0x00000008,
  PRF_CHILDREN = 0x00000010,
  PRF_OWNED = 0x00000020
}

private const int WM_PRINT       = 0x0317;
private const int WM_PRINTCLIENT = 0x0318;

[DllImport("user32.dll")]
private static extern int SendMessage (IntPtr hWnd, int msg, 
      IntPtr dc, DrawingOptions opts);

Так вот, сохранённый bm.png полностью белый, если под фокусом было окно не моего приложения и только если под фокусом форма моего приложения, то картинка более-менее нормальная (только форма — без контролов). Не подскажите, как правильно получить картинку чужого окна?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.