You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.9 KiB
C#
91 lines
2.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
|
|
namespace POSV.Utils
|
|
{
|
|
public class ScreenCapturePInvoke
|
|
{
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
private struct CURSORINFO
|
|
{
|
|
public Int32 cbSize;
|
|
public Int32 flags;
|
|
public IntPtr hCursor;
|
|
public POINTAPI ptScreenPos;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
private struct POINTAPI
|
|
{
|
|
public int x;
|
|
public int y;
|
|
}
|
|
|
|
[DllImport("user32.dll")]
|
|
private static extern bool GetCursorInfo(out CURSORINFO pci);
|
|
|
|
[DllImport("user32.dll", SetLastError = true)]
|
|
static extern bool DrawIconEx(IntPtr hdc, int xLeft, int yTop, IntPtr hIcon, int cxWidth, int cyHeight, int istepIfAniCur, IntPtr hbrFlickerFreeDraw, int diFlags);
|
|
|
|
private const Int32 CURSOR_SHOWING = 0x0001;
|
|
private const Int32 DI_NORMAL = 0x0003;
|
|
|
|
public static Bitmap CaptureFullScreen(bool captureMouse)
|
|
{
|
|
var allBounds = Screen.AllScreens.Select(s => s.Bounds).ToArray();
|
|
Rectangle bounds = Rectangle.FromLTRB(allBounds.Min(b => b.Left), allBounds.Min(b => b.Top), allBounds.Max(b => b.Right), allBounds.Max(b => b.Bottom));
|
|
|
|
var bitmap = CaptureScreen(bounds, captureMouse);
|
|
return bitmap;
|
|
}
|
|
|
|
public static Bitmap CapturePrimaryScreen(bool captureMouse)
|
|
{
|
|
Rectangle bounds = Screen.PrimaryScreen.Bounds;
|
|
|
|
var bitmap = CaptureScreen(bounds, captureMouse);
|
|
return bitmap;
|
|
}
|
|
|
|
public static Bitmap CaptureScreen(Rectangle bounds, bool captureMouse)
|
|
{
|
|
Bitmap result = new Bitmap(bounds.Width, bounds.Height);
|
|
|
|
try
|
|
{
|
|
using (Graphics g = Graphics.FromImage(result))
|
|
{
|
|
g.CopyFromScreen(bounds.Location, Point.Empty, bounds.Size);
|
|
|
|
if (captureMouse)
|
|
{
|
|
CURSORINFO pci;
|
|
pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
|
|
|
|
if (GetCursorInfo(out pci))
|
|
{
|
|
if (pci.flags == CURSOR_SHOWING)
|
|
{
|
|
var hdc = g.GetHdc();
|
|
DrawIconEx(hdc, pci.ptScreenPos.x - bounds.X, pci.ptScreenPos.y - bounds.Y, pci.hCursor, 0, 0, 0, IntPtr.Zero, DI_NORMAL);
|
|
g.ReleaseHdc();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
result = null;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|