您的位置:首页 > 编程语言 > C#

C# 最小化窗口截图 句柄 调用截图 黑屏原因

2015-08-10 14:11 766 查看
BitBlt 方法。缺点,不能截取隐藏和最小化窗口

public static Image GetWindowCapture(IntPtr handle)

{

// get te hDC of the target window

IntPtr hdcSrc = User32.GetWindowDC(handle);

User32.ShowWindow(hdcSrc, 1);

// get the size

User32.RECT windowRect = new User32.RECT();

User32.GetWindowRect(handle, ref windowRect);

int width = windowRect.right - windowRect.left;

int height = windowRect.bottom - windowRect.top;

// create a device context we can copy to

IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);

// create a bitmap we can copy it to,

// using GetDeviceCaps to get the width/height

IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);

// select the bitmap object

IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);

// bitblt over

GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY | GDI32.CAPTUREBLT);

// restore selection

GDI32.SelectObject(hdcDest, hOld);

// clean up

GDI32.DeleteDC(hdcDest);

User32.ReleaseDC(handle, hdcSrc);

// get a .NET image object for it

Image img = Image.FromHbitmap(hBitmap);

// free up the Bitmap object

GDI32.DeleteObject(hBitmap);

return img;

}

/// <summary>

/// Helper class containing Gdi32 API functions

/// </summary>

public class GDI32

{

public const int CAPTUREBLT = 1073741824;

public const int SRCCOPY = 0x00CC0020; // BitBlt dwRop parameter

[DllImport("gdi32.dll")]

public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest,

int nWidth, int nHeight, IntPtr hObjectSource,

int nXSrc, int nYSrc, int dwRop);

[DllImport("gdi32.dll")]

public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth,

int nHeight);

[DllImport("gdi32.dll")]

public static extern IntPtr CreateCompatibleDC(IntPtr hDC);

[DllImport("gdi32.dll")]

public static extern bool DeleteDC(IntPtr hDC);

[DllImport("gdi32.dll")]

public static extern bool DeleteObject(IntPtr hObject);

[DllImport("gdi32.dll")]

public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);

}

/// <summary>

/// Helper class containing User32 API functions

/// </summary>

public class User32

{

[StructLayout(LayoutKind.Sequential)]

public struct RECT

{

public int left;

public int top;

public int right;

public int bottom;

}

[DllImport("user32.dll")]

public static extern IntPtr GetDesktopWindow();

[DllImport("user32.dll")]

public static extern IntPtr GetWindowDC(IntPtr hWnd);

[DllImport("user32.dll")]

public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);

[DllImport("user32.dll")]

public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]

public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);

#region 窗口关联

// nCmdShow的含义

//0 关闭窗口

//1 正常大小显示窗口

//2 最小化窗口

//3 最大化窗口

//使用实例: ShowWindow(myPtr, 0);

#endregion

}

PrintWindow 方法,可以实现隐藏窗口截图。如果出现黑屏,请关闭 显卡加速设置

public static Bitmap GetWindowCapture(IntPtr hWnd)

{

IntPtr hscrdc = GetWindowDC(hWnd);

//RECT windowRect = new RECT();

//GetWindowRect(hWnd, ref windowRect);

//int width = windowRect.right - windowRect.left;

//int height = windowRect.bottom - windowRect.top;

Window xx = (Window)System.Windows.Interop.HwndSource.FromHwnd(hWnd).RootVisual;

IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, Convert.ToInt32(xx.Width), Convert.ToInt32(xx.Height));

//IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, width, height);

IntPtr hmemdc = CreateCompatibleDC(hscrdc);

SelectObject(hmemdc, hbitmap);

PrintWindow(hWnd, hmemdc, 0);

//Image bmp = Image.FromHbitmap(hbitmap);

Bitmap bmp = Bitmap.FromHbitmap(hbitmap);

DeleteDC(hscrdc);//删除用过的对象

DeleteDC(hmemdc);//删除用过的对象

return bmp;

}

//[DllImport("user32.dll")]

//public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);

[DllImport("gdi32.dll")]

public static extern IntPtr CreateDC(

string lpszDriver, // driver name驱动名

string lpszDevice, // device name设备名

string lpszOutput, // not used; should be NULL

IntPtr lpInitData // optional printer data

);

[DllImport("gdi32.dll")]

public static extern int BitBlt(

IntPtr hdcDest, // handle to destination DC目标设备的句柄

int nXDest, // x-coord of destination upper-left corner目标对象的左上角的X坐标

int nYDest, // y-coord of destination upper-left corner目标对象的左上角的Y坐标

int nWidth, // width of destination rectangle目标对象的矩形宽度

int nHeight, // height of destination rectangle目标对象的矩形长度

IntPtr hdcSrc, // handle to source DC源设备的句柄

int nXSrc, // x-coordinate of source upper-left corner源对象的左上角的X坐标

int nYSrc, // y-coordinate of source upper-left corner源对象的左上角的Y坐标

UInt32 dwRop // raster operation code光栅的操作值

);

[DllImport("gdi32.dll")]

public static extern IntPtr CreateCompatibleDC(

IntPtr hdc // handle to DC

);

[DllImport("gdi32.dll")]

public static extern IntPtr CreateCompatibleBitmap(

IntPtr hdc, // handle to DC

int nWidth, // width of bitmap, in pixels

int nHeight // height of bitmap, in pixels

);

[DllImport("gdi32.dll")]

public static extern IntPtr SelectObject(

IntPtr hdc, // handle to DC

IntPtr hgdiobj // handle to object

);

[DllImport("gdi32.dll")]

public static extern int DeleteDC(

IntPtr hdc // handle to DC

);

[DllImport("user32.dll")]

public static extern bool PrintWindow(

IntPtr hwnd, // Window to copy,Handle to the window that will be copied.

IntPtr hdcBlt, // HDC to print into,Handle to the device context.

UInt32 nFlags // Optional flags,Specifies the drawing options. It can be one of the following values.

);

[DllImport("user32.dll")]

public static extern IntPtr GetWindowDC(

IntPtr hwnd

);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: