|
public
class NativeMethods
{
/// <summary>
/// Takes a
screenshot of full screen
/// </summary>
/// <returns>Return the
Bitmap of the Screen</returns>
public
static Bitmap CaptureScreen()
{
return CaptureRegion(null);
}
/// <summary>
/// Takes a
Screen Shot of the given rectangle.
/// </summary>
/// <param name="rct">Rectangle
area which we try to get the screen shot.</param>
/// <returns>Return the
Bitmap of the screen defined rectangle.</returns>
public static
Bitmap CaptureRegion(Rectangle rct)
{
return CaptureRegion(new Region(rct));
}
/// <summary>
/// Takes a
screen shot of the given region.
/// </summary>
/// <param name="rgn">Region
that which we try to get the picture of it.</param>
/// <returns>Returns the Bitmap of
the given region.
/// Bitmap
Size will be equal to the GetBounds() of the Region.
/// Any
other points that they are not in the region and
///
which are in the Bounds will be as Color.Transparent.</returns>
public static
Bitmap CaptureRegion(Region rgn)
{
IntPtr hSDc, hMDc;
IntPtr hBtm, hOldBtm;
Size imgSize = Size.Empty;
int xCoor = 0, yCoor = 0;
if (rgn == null)
{
hSDc = CreateDC("DISPLAY", string.Empty,string.Empty,
string.Empty);
hMDc = CreateCompatibleDC(hSDc);
imgSize = new Size(GetDeviceCaps(hSDc, 8),
GetDeviceCaps(hSDc, 10));
GraphicsPath p = new GraphicsPath();
p.AddRectangle(new Rectangle(0, 0, imgSize.Width, imgSize.Height));
rgn = new Region(p);
}
else
{
hSDc = GetDC(IntPtr.Zero);
SelectClipRgn(hSDc, rgn.GetHrgn(Graphics.FromHdc(hSDc)));
hMDc = CreateCompatibleDC(hSDc);
RECT myBox = new RECT();
GetClipBox(hSDc, ref myBox);
imgSize = new Size(myBox.Width, myBox.Height);
xCoor = myBox.left;
yCoor = myBox.top;
}
hBtm =
CreateCompatibleBitmap(hSDc,
imgSize.Width, imgSize.Height);
hOldBtm = SelectObject(hMDc, hBtm);
BitBlt(hMDc, 0, 0, imgSize.Width, imgSize.Height,
hSDc, xCoor, yCoor, RasterOperations.SRCCOPY);
hBtm = SelectObject(hMDc, hOldBtm);
DeleteDC(hSDc);
DeleteDC(hMDc);
Bitmap bmp = Bitmap.FromHbitmap(hBtm);
RectangleF rct = rgn.GetBounds(Graphics.FromImage(bmp));
RectangleF[] rcts =
rgn.GetRegionScans(new Matrix());
for (int i = 0; i < rcts.Length; i++)
{
rcts[i].X -= rct.X;
rcts[i].Y -= rct.Y;
}
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height;
y++)
{
bool isIn =
IsInRectangles(rcts, (float)x, (float)y);
if (!isIn)
bmp.SetPixel(x, y, Color.Transparent);
}
}
DeleteObject(hBtm);
return bmp;
}
/// <summary>
/// Checks
that is in region.
/// </summary>
public static
bool IsInRegion(Region
rgn, Point pt)
{
RectangleF[] rcts =
rgn.GetRegionScans(new Matrix());
return IsInRectangles(rcts, pt);
}
public static
bool IsInRectangles(RectangleF[]
rcts, Point pt)
{
return IsInRectangles(rcts, (float)pt.X, (float)pt.Y);
}
/// <summary>
/// Checks
that is Point in Rectangles (Scans of Region).
/// </summary>
public static
bool IsInRectangles(RectangleF[]
rcts, float x, float y)
{
for (int i = 0; i < rcts.Length;
i++)
{
if (rcts[i].Contains(x, y))
{
return true;
}
}
return false;
}
public unsafe static
void PasteToScreen(Bitmap
bmp, Region rgn)
{
if (bmp == null
|| rgn == null)
return;
IntPtr hDc = GetDC(IntPtr.Zero);
Graphics g = Graphics.FromHdc(hDc);
RectangleF rctF = rgn.GetBounds(Graphics.FromHdc(hDc));
Rectangle rct = new Rectangle((int)rctF.X, (int)rctF.Y,
(int)rctF.Width,
(int)rctF.Height);
g.SetClip(rgn, CombineMode.Replace);
g.DrawImage((Image)bmp, rct);
DeleteDC(hDc);
g.Dispose();
}
// NATIVE METHODS
[DllImport("gdi32.dll")]
public static
extern int
BitBlt(IntPtr srchDC, int
srcX, int srcY,
int srcW, int srcH, IntPtr
desthDC, int destX,
int destY, RasterOperations op);
[DllImport("gdi32.dll",
CharSet = CharSet.Auto)]
public static
extern IntPtr
CreateDC(string lpDriverName,
string lpDeviceName,
string lpOutput,
string lpInitData);
[DllImport("gdi32.dll",
CharSet = CharSet.Auto)]
public static
extern IntPtr
CreateCompatibleDC(IntPtr hDC);
[DllImport("gdi32.dll")]
public static
extern int
GetDeviceCaps(IntPtr hdc, int nIndex);
[DllImport("user32.dll",
CharSet = CharSet.Auto)]
public static
extern IntPtr
GetDC(IntPtr hWnd);
[DllImport("gdi32.dll",
CharSet = CharSet.Auto)]
public static
extern int
GetClipBox(IntPtr hDC, ref RECT rectBox);
[DllImport("gdi32.dll",
CharSet = CharSet.Auto)]
public static
extern int
SelectClipRgn(IntPtr hDC, IntPtr hRgn);
[DllImport("gdi32.dll",
CharSet = CharSet.Auto)]
public static
extern IntPtr
CreateCompatibleBitmap(IntPtr hDC,
int
nWidth, int nHeight);
[DllImport("gdi32.dll",
CharSet = CharSet.Auto)]
public static
extern IntPtr
SelectObject(IntPtr hDC, IntPtr hObject);
[DllImport("gdi32.dll",
CharSet = CharSet.Auto)]
public static
extern bool
DeleteDC(IntPtr hDC);
[DllImport("gdi32.dll",
CharSet = CharSet.Auto)]
public static
extern IntPtr
DeleteObject(IntPtr hObject);
[DllImport("user32.dll")]
public static
extern IntPtr
SetTimer(IntPtr hWnd, int nIDEvent,
int
uElapse, TimerProc lpTimerFunc);
public delegate
void TimerProc(IntPtr hWnd, int
msg, IntPtr wParam,
IntPtr lParam);
[DllImport("user32.dll")]
public static
extern bool
KillTimer(IntPtr hwnd, int idEvent);
public enum
RasterOperations : uint
{
SRCCOPY = 0x00CC0020,
SRCPAINT = 0x00EE0086,
SRCAND = 0x008800C6,
SRCINVERT = 0x00660046,
SRCERASE = 0x00440328,
NOTSRCCOPY = 0x00330008,
NOTSRCERASE = 0x001100A6,
MERGECOPY = 0x00C000CA,
MERGEPAINT = 0x00BB0226,
PATCOPY = 0x00F00021,
PATPAINT = 0x00FB0A09,
PATINVERT = 0x005A0049,
DSTINVERT = 0x00550009,
BLACKNESS = 0x00000042,
WHITENESS = 0x00FF0062
}
[StructLayout(LayoutKind.Sequential)]
public struct
RECT
{
public int left;
public int top;
public int right;
public int bottom;
public int Width
{
get { return right - left; }
}
public int Height
{
get { return bottom - top; }
}
}
}
|