2020-01-15 17:59:29 +01:00
|
|
|
|
using System;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
using CC_Functions.W32.DCDrawer;
|
|
|
|
|
using CC_Functions.W32.Native;
|
|
|
|
|
|
|
|
|
|
namespace CC_Functions.W32
|
|
|
|
|
{
|
|
|
|
|
public static class ScreenMan
|
|
|
|
|
{
|
2020-01-16 19:50:31 +01:00
|
|
|
|
private const int SRCCOPY = 13369376;
|
2020-01-15 17:59:29 +01:00
|
|
|
|
public static Image CaptureScreen() => CaptureWindow(user32.GetDesktopWindow());
|
|
|
|
|
|
|
|
|
|
public static Image CaptureWindow(IntPtr handle)
|
|
|
|
|
{
|
|
|
|
|
IntPtr hdcSrc = user32.GetWindowDC(handle);
|
|
|
|
|
RECT windowRect = new RECT();
|
|
|
|
|
user32.GetWindowRect(handle, ref windowRect);
|
|
|
|
|
IntPtr hdcDest = gdi32.CreateCompatibleDC(hdcSrc);
|
|
|
|
|
IntPtr hBitmap = gdi32.CreateCompatibleBitmap(hdcSrc, windowRect.Width, windowRect.Height);
|
|
|
|
|
IntPtr hOld = gdi32.SelectObject(hdcDest, hBitmap);
|
|
|
|
|
gdi32.BitBlt(hdcDest, 0, 0, windowRect.Width, windowRect.Height, hdcSrc, 0, 0, SRCCOPY);
|
|
|
|
|
gdi32.SelectObject(hdcDest, hOld);
|
|
|
|
|
gdi32.DeleteDC(hdcDest);
|
|
|
|
|
user32.ReleaseDC(handle, hdcSrc);
|
|
|
|
|
Image img = Image.FromHbitmap(hBitmap);
|
|
|
|
|
gdi32.DeleteObject(hBitmap);
|
|
|
|
|
return img;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void Draw(Image img)
|
|
|
|
|
{
|
|
|
|
|
using (IDCDrawer drawerBuffered = GetDrawer())
|
|
|
|
|
{
|
|
|
|
|
drawerBuffered.Graphics.DrawImage(img, GetBounds());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static IDCDrawer GetDrawer(bool buffer = true)
|
|
|
|
|
{
|
|
|
|
|
IntPtr ptr = user32.GetDC(IntPtr.Zero);
|
|
|
|
|
return buffer ? (IDCDrawer) new DCBuffered(ptr) : new DCUnbuffered(ptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Rectangle GetBounds() => Screen.PrimaryScreen.Bounds;
|
|
|
|
|
|
|
|
|
|
public static void Refresh() => shell32.SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
|
|
|
|
|
}
|
|
|
|
|
}
|