Permalink
34349ba Aug 10, 2016
186 lines (155 sloc) 6.85 KB
using System;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using Debug = UnityEngine.Debug;
using Graphics = System.Drawing.Graphics;
namespace ScreenCapture
{
class CaptureScreen
{
//This structure shall be used to keep the size of the screen.
public struct SIZE
{
public int cx;
public int cy;
}
public static Bitmap CaptureDesktop(int x = 0, int y = 0, int wid = -1, int hei = -1)
{
SIZE size;
IntPtr hBitmap;
IntPtr hDC = Win32Stuff.GetDC(Win32Stuff.GetDesktopWindow());
IntPtr hMemDC = GDIStuff.CreateCompatibleDC(hDC);
size.cx = wid == -1 ? Win32Stuff.GetSystemMetrics(Win32Stuff.SM_CXSCREEN) : wid;
size.cy = hei == -1 ? Win32Stuff.GetSystemMetrics(Win32Stuff.SM_CYSCREEN) : hei;
hBitmap = GDIStuff.CreateCompatibleBitmap(hDC, size.cx, size.cy);
if (hBitmap != IntPtr.Zero)
{
IntPtr hOld = (IntPtr)GDIStuff.SelectObject(hMemDC, hBitmap);
GDIStuff.BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, x, y, GDIStuff.SRCCOPY);
GDIStuff.SelectObject(hMemDC, hOld);
GDIStuff.DeleteDC(hMemDC);
Win32Stuff.ReleaseDC(Win32Stuff.GetDesktopWindow(), hDC);
Bitmap bmp = System.Drawing.Image.FromHbitmap(hBitmap);
GDIStuff.DeleteObject(hBitmap);
GC.Collect();
return bmp;
}
return null;
}
public static Bitmap CaptureWindow(IntPtr wnd, WindowSettings settings, out SIZE size, out Win32Stuff.WINDOWINFO info)
{
IntPtr hBitmap;
IntPtr hDC = Win32Stuff.GetDC(Win32Stuff.GetDesktopWindow());
IntPtr hMemDC = GDIStuff.CreateCompatibleDC(hDC);
info = new Win32Stuff.WINDOWINFO();
info.cbSize = (uint)Marshal.SizeOf(info);
Win32Stuff.GetWindowInfo(wnd, ref info);
size.cx = Math.Max(1, info.rcClient.Width + settings.offsetRight - settings.offsetLeft);
size.cy = Math.Max(1, info.rcClient.Height + settings.offsetBottom - settings.offsetTop);
hBitmap = GDIStuff.CreateCompatibleBitmap(hDC, size.cx, size.cy);
if (hBitmap != IntPtr.Zero)
{
IntPtr hOld = (IntPtr)GDIStuff.SelectObject(hMemDC, hBitmap);
GDIStuff.BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, info.rcWindow.X + settings.offsetLeft, info.rcWindow.Y + settings.offsetTop, GDIStuff.SRCCOPY);
GDIStuff.SelectObject(hMemDC, hOld);
GDIStuff.DeleteDC(hMemDC);
Win32Stuff.ReleaseDC(Win32Stuff.GetDesktopWindow(), hDC);
Bitmap bmp = System.Drawing.Image.FromHbitmap(hBitmap);
GDIStuff.DeleteObject(hBitmap);
GC.Collect();
return bmp;
}
return null;
}
public static Bitmap CaptureWindowDirect(IntPtr wnd, WindowSettings settings, out SIZE size, out Win32Stuff.WINDOWINFO info)
{
IntPtr hBitmap;
IntPtr hDC = Win32Stuff.GetDC(wnd);
IntPtr hMemDC = GDIStuff.CreateCompatibleDC(hDC);
info = new Win32Stuff.WINDOWINFO();
info.cbSize = (uint)Marshal.SizeOf(info);
Win32Stuff.GetWindowInfo(wnd, ref info);
size.cx = Math.Max(1, info.rcClient.Width + settings.offsetRight - settings.offsetLeft);
size.cy = Math.Max(1, info.rcClient.Height + settings.offsetBottom - settings.offsetTop);
hBitmap = GDIStuff.CreateCompatibleBitmap(hDC, size.cx, size.cy);
if (hBitmap != IntPtr.Zero)
{
IntPtr hOld = (IntPtr)GDIStuff.SelectObject(hMemDC, hBitmap);
GDIStuff.BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, settings.offsetLeft, settings.offsetTop, GDIStuff.SRCCOPY);
GDIStuff.SelectObject(hMemDC, hOld);
GDIStuff.DeleteDC(hMemDC);
Win32Stuff.ReleaseDC(Win32Stuff.GetDesktopWindow(), hDC);
Bitmap bmp = System.Drawing.Image.FromHbitmap(hBitmap);
GDIStuff.DeleteObject(hBitmap);
GC.Collect();
return bmp;
}
return null;
}
public static RECT GetWindowRect(IntPtr wnd)
{
RECT r = new RECT();
Win32Stuff.GetWindowRect(wnd, ref r);
return r;
}
public static bool SetWindowRect(IntPtr wnd, RECT r, bool Top)
{
return Win32Stuff.SetWindowPos(wnd,
(IntPtr)(Top ? SpecialWindowHandles.HWND_TOP : SpecialWindowHandles.HWND_BOTTOM),
r.Left,
r.Top,
r.Width,
r.Height,
Top ? (SetWindowPosFlags.SWP_NOMOVE | SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOOWNERZORDER)
: (SetWindowPosFlags.SWP_NOMOVE | SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOOWNERZORDER | SetWindowPosFlags.SWP_NOACTIVATE));
}
static Bitmap CaptureCursor(ref int x, ref int y)
{
Bitmap bmp;
IntPtr hicon;
Win32Stuff.CURSORINFO ci = new Win32Stuff.CURSORINFO();
Win32Stuff.ICONINFO icInfo;
ci.cbSize = Marshal.SizeOf(ci);
if (Win32Stuff.GetCursorInfo(out ci))
{
if (ci.flags == Win32Stuff.CURSOR_SHOWING)
{
UnityEngine.Debug.Log(ci.hCursor);
hicon = Win32Stuff.CopyIcon(ci.hCursor);
if (Win32Stuff.GetIconInfo(hicon, out icInfo))
{
x = ci.ptScreenPos.x - ((int)icInfo.xHotspot);
y = ci.ptScreenPos.y - ((int)icInfo.yHotspot);
UnityEngine.Debug.Log(hicon);
Icon ic = Icon.FromHandle(hicon);
bmp = ic.ToBitmap();
return bmp;
}
}
}
return null;
}
public static Bitmap CaptureDesktopWithCursor()
{
int cursorX = 0;
int cursorY = 0;
Bitmap desktopBMP;
Bitmap cursorBMP;
desktopBMP = CaptureDesktop();
cursorBMP = CaptureCursor(ref cursorX, ref cursorY);
if (desktopBMP != null)
{
if (cursorBMP != null)
{
Rectangle r = new Rectangle(cursorX, cursorY, cursorBMP.Width, cursorBMP.Height);
Graphics g = Graphics.FromImage(desktopBMP);
g.DrawImage(cursorBMP, r);
g.Flush();
}
return desktopBMP;
}
return null;
}
}
}