и попытаться отобразить скриншот рабочего стола, то отображаются только иконки и кнопки: закрыть, развернуть и свернуть, а все остальное — белый фон. В случае Image.FromHbitmap(IntPtr hbitmap) все отображается корректно.
Здравствуйте, Clickmaker, Вы писали:
C>??? Получаем как HBITMAP, а удаляем как HDC?
Да
[DllImport("gdi32.dll")]
public static extern bool DeleteDC(IntPtr hDC);
Re[2]: Image.FromHbitmap(IntPtr hbitmap)
От:
Аноним
Дата:
17.11.10 13:51
Оценка:
Здравствуйте, Clickmaker, Вы писали:
А>> IntPtr ip = source.GetHbitmap();
А>> finally А>> { А>> GDI32.DeleteDC(ip); А>> }
C>??? Получаем как HBITMAP, а удаляем как HDC?
Вот примеры Пример1 Пример2
Вроде так делается — все от туда брал
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Clickmaker, Вы писали:
А>>> IntPtr ip = source.GetHbitmap();
А>>> finally А>>> { А>>> GDI32.DeleteDC(ip); А>>> }
C>>??? Получаем как HBITMAP, а удаляем как HDC?
А>Вот примеры А>Пример1 А>Пример2 А>Вроде так делается — все от туда брал
А>скриншот рабочего стола, то отображаются только иконки и кнопки: закрыть, развернуть и свернуть
который где? в bitmapSource?
чьи там иконки и кнопки?
Re[4]: Image.FromHbitmap(IntPtr hbitmap)
От:
Аноним
Дата:
18.11.10 07:30
Оценка:
Здравствуйте, Clickmaker, Вы писали:
C>вообще-то там DeleteObject
Да-да. спасибо))) а я думаю почему память кушается
Но проблема с отображением все равно осталась.
Re[2]: Image.FromHbitmap(IntPtr hbitmap)
От:
Аноним
Дата:
18.11.10 07:43
Оценка:
Здравствуйте, Clickmaker, Вы писали:
А>>скриншот рабочего стола, то отображаются только иконки и кнопки: закрыть, развернуть и свернуть
C>который где? в bitmapSource? C>чьи там иконки и кнопки?
У меня есть такие методы:
public static System.Windows.Media.Imaging.BitmapSource CaptureScreenWPF()
{
return CaptureWindowWPF(User32.GetDesktopWindow());
}
public static System.Windows.Media.Imaging.BitmapSource CaptureWindowWPF(IntPtr handle)
{
IntPtr hdcSrc = User32.GetWindowDC(handle);
User32.RECT windowRect = new User32.RECT();
User32.GetWindowRect(handle, ref windowRect);
int width = windowRect.right - windowRect.left;
int height = windowRect.bottom - windowRect.top;
IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
GDI32.SelectObject(hdcDest, hOld);
GDI32.DeleteDC(hdcDest);
User32.ReleaseDC(handle, hdcSrc);
System.Windows.Media.Imaging.BitmapSource bs = null;
try
{
bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip,
IntPtr.Zero, System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
finally
{
GDI32.DeleteObject(ip);
}
return bs;
}
private class GDI32
{
public const int SRCCOPY = 0x00CC0020;
[DllImport("gdi32.dll")]
public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hObjectSource,
int nXSrc, int nYSrc, int dwRop);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth, int nHeight);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
[DllImport("gdi32.dll")]
public static extern bool DeleteDC(IntPtr hDC);
[DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
}
private class User32
{
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("user32.dll")]
public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);
}
вообщем когда я получаю скриншот при вызове метода CaptureScreenWPF() — получаю почему то его частично. т.е. если открыты окна, то на картинке отображаются кнопки: закрыть, развернуть и свернуть — т.е. правый верхний угол. и иконка окна(левый верхний угол). и еще отображаются иконки на панели инструментов. Я бы выложил картинку, но не знаю как... Я думаю если вы скопируете эти методы и попытаетесь отобразить рабочий стол — то увидите этот эффект.
Кстати если сначала получить картинку в виде System.Drawing.Bitmap, а потом использовать метод
Да, там наблюдается некоторая избирательность.
Не виден системный текст на таскбаре и, похоже, 16-цветные иконки у некоторых приложений.
а насчет "если сначала получить картинку в виде System.Drawing.Bitmap" — каким образом?
Re[6]: Image.FromHbitmap(IntPtr hbitmap)
От:
Аноним
Дата:
18.11.10 10:39
Оценка:
Здравствуйте, Clickmaker, Вы писали:
C>Да, там наблюдается некоторая избирательность. C>Не виден системный текст на таскбаре и, похоже, 16-цветные иконки у некоторых приложений.
Не знаешь как это исправить?
C>а насчет "если сначала получить картинку в виде System.Drawing.Bitmap" — каким образом?