7,655
社区成员
发帖
与我相关
我的任务
分享
public static Bitmap GetDesktopImage()
{
SIZE size;
IntPtr hBitmap;
IntPtr hDC = PlatformInvokeUSER32.GetDC(PlatformInvokeUSER32.GetDesktopWindow());
IntPtr hMemDC = PlatformInvokeGDI32.CreateCompatibleDC(hDC);
size.cx = PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CXSCREEN);
size.cy = PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CYSCREEN);
hBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy);
if (hBitmap != IntPtr.Zero)
{
IntPtr hOld = (IntPtr)PlatformInvokeGDI32.SelectObject(hMemDC, hBitmap);
PlatformInvokeGDI32.BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, PlatformInvokeGDI32.SRCCOPY);
PlatformInvokeGDI32.SelectObject(hMemDC, hOld);
PlatformInvokeGDI32.DeleteDC(hMemDC);
PlatformInvokeUSER32.ReleaseDC(PlatformInvokeUSER32.GetDesktopWindow(), hDC);
Bitmap bmp = System.Drawing.Image.FromHbitmap(hBitmap);
PlatformInvokeGDI32.DeleteObject(hBitmap);
GC.Collect();
return bmp;
}
return null;
}
[DllImport("coredll.dll")]
extern public static Int32 BitBlt(IntPtr hdcDest, Int32 xDest, Int32 yDest, Int32 wDest, Int32 hDest, IntPtr hdcSrc, Int32 xSrc, Int32 ySrc, Int64 dwRop);
public const Int64 SRCCOPY = 0x00CC0020; /* dest = source */
public const Int64 SRCPAINT = 0x00EE0086; /* dest = source OR dest */
public const Int64 SRCAND = 0x008800C6; /* dest = source AND dest */
public const Int64 SRCINVERT = 0x00660046; /* dest = source XOR dest */
public const Int64 SRCERASE = 0x00440328; /* dest = source AND (NOT dest ) */
public const Int64 NOTSRCCOPY = 0x00330008; /* dest = (NOT source) */
public const Int64 NOTSRCERASE = 0x001100A6; /* dest = (NOT src) AND (NOT dest) */
public const Int64 MERGECOPY = 0x00C000CA; /* dest = (source AND pattern) */
public const Int64 MERGEPAINT = 0x00BB0226; /* dest = (NOT source) OR dest */
public const Int64 PATCOPY = 0x00F00021; /* dest = pattern */
public const Int64 PATPAINT = 0x00FB0A09; /* dest = DPSnoo */
public const Int64 PATINVERT = 0x005A0049; /* dest = pattern XOR dest */
public const Int64 DSTINVERT = 0x00550009; /* dest = (NOT dest) */
public const Int64 BLACKNESS = 0x00000042; /* dest = BLACK */
public const Int64 WHITENESS = 0x00FF0062; /* dest = WHITE */
[System.Runtime.InteropServices.DllImportAttribute("coredll.dll")]
public static extern IntPtr CreateDC(
string lpszDriver, // 驱动名称
string lpszDevice, // 设备名称
string lpszOutput, // 无用,可以设定位"NULL"
IntPtr lpInitData // 任意的打印机数据
);
private Bitmap g_Image_LastScreen;
// this.g_Image_LastScreen = new Bitmap(240, 320);
private void GetDisplay2Buffer()
{
IntPtr mainDC = CreateDC("DISPLAY", null, null, (IntPtr)null);
//创建显示器的DC
Graphics gxSrc = Graphics.FromHdc(mainDC);
//由一个指定设备的句柄创建一个新的Graphics对象
//通过下面代码就可以实现此功能:
Graphics gxDes = Graphics.FromImage(g_Image_LastScreen);
//(3).获得当前屏幕和位图的句柄:
//获得此二个对象的句柄是为了下一步实现对当前屏幕图象的捕获,程序中实现的具体捕获的方法是把当前屏幕捕获到已经创建的位图对象中。具体实现代码如下:
//获得屏幕的句柄
IntPtr hDC_Src = gxSrc.GetHdc();
//获得位图的句柄
IntPtr hDC_Des = gxDes.GetHdc();
//把当前屏幕捕获到位图对象中
BitBlt(hDC_Des, 0, 0, 240, 320, hDC_Src, 0, 0, SRCCOPY);
gxSrc.ReleaseHdc(hDC_Src);
//释放屏幕句柄
gxDes.ReleaseHdc(hDC_Des);
//释放位图句柄
}