首页 / C# / C#使用BitBlt进行窗口抓图
C#使用BitBlt进行窗口抓图
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#使用BitBlt进行窗口抓图,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7454字,纯文字阅读大概需要11分钟。
内容图文
本文和C++使用BitBlt进行窗口抓图对应,使用C#实现。
1、Win32封装
Win32Consts
using System.ComponentModel; namespace CaptureSharp { public sealed class Win32Consts { public enum DibColorMode : uint { DIB_RGB_COLORS = 0x00, DIB_PAL_COLORS = 0x01, DIB_PAL_INDICES = 0x02 } publicenum BitmapCompressionMode : uint { BI_RGB = 0, BI_RLE8 = 1, BI_RLE4 = 2, BI_BITFIELDS = 3, BI_JPEG = 4, BI_PNG = 5 } publicenum RasterOperationMode : 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, CAPTUREBLT = 0x40000000//only if WinVer >= 5.0.0 (see wingdi.h) } publicenum PrintWindowMode : uint { [Description( "Only the client area of the window is copied to hdcBlt. By default, the entire window is copied.")] PW_CLIENTONLY = 0x00000001, [Description("works on windows that use DirectX or DirectComposition")] PW_RENDERFULLCONTENT = 0x00000002 } } }
Win32Types
using System.Runtime.InteropServices; namespace CaptureSharp { public sealed class Win32Types { [StructLayout(LayoutKind.Sequential)] public struct Point { public int x; public int y; public Point(int x, int y) { this.x = x; this.y = y; } } [StructLayout(LayoutKind.Sequential)] publicstruct Rect { publicint Left; //最左坐标publicint Top; //最上坐标publicint Right; //最右坐标publicint Bottom; //最下坐标publicint Width => Right - Left; publicint Height => Bottom - Top; } [StructLayout(LayoutKind.Sequential, Pack = 2)] publicstruct BitmapFileHeader { publicushort bfType; publicuint bfSize; publicushort bfReserved1; publicushort bfReserved2; publicuint bfOffBits; } [StructLayout(LayoutKind.Sequential)] publicstruct BitmapInfoHeader { publicuint biSize; publicint biWidth; publicint biHeight; publicushort biPlanes; publicushort biBitCount; publicuint biCompression; publicuint biSizeImage; publicint biXPelsPerMeter; publicint biYPelsPerMeter; publicuint biClrUsed; publicuint biClrImportant; publicvoid Init() { biSize = (uint)Marshal.SizeOf(this); } } [StructLayout(LayoutKind.Sequential, Pack = 1)] publicstruct RgbQuad { publicbyte rgbBlue; publicbyte rgbGreen; publicbyte rgbRed; publicbyte rgbReserved; } [StructLayout(LayoutKind.Sequential, Pack = 1)] publicstruct BitmapInfo { public BitmapInfoHeader bmiHeader; public RgbQuad bmiColors; } } }
Win32Funcs
using System; using System.Runtime.InteropServices; namespace CaptureSharp { public sealed class Win32Funcs { [DllImport( " User32.dll ", SetLastError = true)] publicstaticextern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] publicstaticexternbool GetWindowRect(IntPtr hWnd, out Win32Types.Rect lpRect); [DllImport("user32.dll")] publicstaticexternbool GetClientRect(IntPtr hWnd, out Win32Types.Rect lpRect); [DllImport("user32.dll", EntryPoint = "GetWindowDC")] publicstaticextern IntPtr GetWindowDC(IntPtr hWnd); [DllImport("gdi32.dll")] publicstaticextern IntPtr CreateCompatibleDC(IntPtr hDc); [DllImport("gdi32.dll")] publicstaticextern IntPtr CreateCompatibleBitmap(IntPtr hDc, int nWidth, int nHeight); [DllImport("gdi32.dll")] publicstaticexternbool DeleteDC(IntPtr hDc); [DllImport("user32.dll")] publicstaticextern IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc); [DllImport("gdi32.dll")] publicstaticextern IntPtr CreateDIBSection(IntPtr hdc, ref Win32Types.BitmapInfo bmi, uint usage, out IntPtr ppvBits, IntPtr hSection, uint dwOffset); [DllImport("gdi32.dll")] publicstaticextern IntPtr SelectObject(IntPtr hDc, IntPtr hObject); [DllImport("gdi32.dll")] publicstaticexternbool DeleteObject(IntPtr hObject); [DllImport("gdi32.dll", SetLastError = true)] publicstaticexternbool BitBlt( IntPtr hObject, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hObjectSource, int nXSrc, int nYSrc, uint dwRop); [DllImport("user32.dll")] publicstaticexternbool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, uint nFlags); } }
2、DibCaptureHelper.cs
using System; namespace CaptureSharp { internal class DibCaptureHelper { public IntPtr BitmapPtr => _hBitmap; public Win32Types.BitmapInfo BitmapInfo => _bitmapInfo; public Win32Types.Rect WindowRect => _windowRect; public Win32Types.Rect ClientRect => _clientRect; publicint BitmapDataSize => _bmpDataSize; private IntPtr _hWnd = IntPtr.Zero; private IntPtr _hScrDc = IntPtr.Zero; private IntPtr _hMemDc = IntPtr.Zero; private IntPtr _hBitmap = IntPtr.Zero; private IntPtr _hOldBitmap = IntPtr.Zero; private IntPtr _bitsPtr = IntPtr.Zero; private Win32Types.BitmapInfo _bitmapInfo; private Win32Types.Rect _windowRect; private Win32Types.Rect _clientRect; privateint _bmpDataSize; publicbool Init(string windowName) { var handle = Win32Funcs.FindWindow(null, windowName); if (handle.Equals(IntPtr.Zero)) { returnfalse; } return Init(handle); } publicbool Init(IntPtr handle) { _hWnd = handle; //获取窗口大小if (!Win32Funcs.GetWindowRect(_hWnd, out _windowRect) || !Win32Funcs.GetClientRect(_hWnd, out _clientRect)) { returnfalse; } _bmpDataSize = _clientRect.Width * _clientRect.Height * 3; //位图信息 _bitmapInfo = new Win32Types.BitmapInfo {bmiHeader = new Win32Types.BitmapInfoHeader()}; _bitmapInfo.bmiHeader.Init(); _bitmapInfo.bmiHeader.biWidth = _clientRect.Width; _bitmapInfo.bmiHeader.biHeight = _clientRect.Height; _bitmapInfo.bmiHeader.biPlanes = 1; _bitmapInfo.bmiHeader.biBitCount = 24; _bitmapInfo.bmiHeader.biSizeImage = (uint) (_clientRect.Width * _clientRect.Height); _bitmapInfo.bmiHeader.biCompression = (uint) Win32Consts.BitmapCompressionMode.BI_RGB; _hScrDc = Win32Funcs.GetWindowDC(_hWnd); _hMemDc = Win32Funcs.CreateCompatibleDC(_hScrDc); _hBitmap = Win32Funcs.CreateDIBSection(_hMemDc, ref _bitmapInfo, (uint) Win32Consts.DibColorMode.DIB_RGB_COLORS, out _bitsPtr, IntPtr.Zero, 0); _hOldBitmap = Win32Funcs.SelectObject(_hMemDc, _hBitmap); returntrue; } publicvoid Cleanup() { if (_hBitmap.Equals(IntPtr.Zero)) { return; } //删除用过的对象 Win32Funcs.SelectObject(_hMemDc, _hOldBitmap); Win32Funcs.DeleteObject(_hBitmap); Win32Funcs.DeleteDC(_hMemDc); Win32Funcs.ReleaseDC(_hWnd, _hScrDc); _hWnd = IntPtr.Zero; _hScrDc = IntPtr.Zero; _hMemDc = IntPtr.Zero; _hBitmap = IntPtr.Zero; _hOldBitmap = IntPtr.Zero; _bitsPtr = IntPtr.Zero; } publicbool RefreshWindow() { var hWnd = _hWnd; Cleanup(); return Init(hWnd); } publicbool ChangeWindowHandle(string windowName) { Cleanup(); return Init(windowName); } publicbool ChangeWindowHandle(IntPtr handle) { Cleanup(); return Init(handle); } public IntPtr Capture() { if (_hBitmap.Equals(IntPtr.Zero) || _hMemDc.Equals(IntPtr.Zero) || _hScrDc.Equals(IntPtr.Zero)) { return IntPtr.Zero; } var ret = Win32Funcs.BitBlt( _hMemDc, 0, 0, _clientRect.Width, _clientRect.Height, _hScrDc, 0, 0, (uint) Win32Consts.RasterOperationMode.SRCCOPY); return ret ? _bitsPtr : IntPtr.Zero; } publicbool Capture(out IntPtr bitsPtr, outint bufferSize, out Win32Types.Rect rect) { bitsPtr = _bitsPtr; bufferSize = _bmpDataSize; rect = _clientRect; if (_hBitmap.Equals(IntPtr.Zero) || _hMemDc.Equals(IntPtr.Zero) || _hScrDc.Equals(IntPtr.Zero)) { returnfalse; } var ret = Win32Funcs.BitBlt( _hMemDc, 0, 0, _clientRect.Width, _clientRect.Height, _hScrDc, 0, 0, (uint) Win32Consts.RasterOperationMode.SRCCOPY); return ret; } } }
原文:https://www.cnblogs.com/xhubobo/p/12789466.html
内容总结
以上是互联网集市为您收集整理的C#使用BitBlt进行窗口抓图全部内容,希望文章能够帮你解决C#使用BitBlt进行窗口抓图所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。