C#使用PrintWindow进行窗口抓图
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#使用PrintWindow进行窗口抓图,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2668字,纯文字阅读大概需要4分钟。
内容图文
![C#使用PrintWindow进行窗口抓图](/upload/InfoBanner/zyjiaocheng/634/3eb70073d4ff40e8b346fe6181dc000a.jpg)
本文和C++使用PrintWindow进行窗口抓图对应,使用C#实现。
Win32封装同C#使用BitBlt进行窗口抓图。
PrintCaptureHelper.cs
using System; namespace CaptureSharp { internal class PrintCaptureHelper { public IntPtr BitmapPtr => _hBitmap; public Win32Types.BitmapInfo BitmapInfo { get; } = new Win32Types.BitmapInfo(); public Win32Types.Rect WindowRect => _windowRect; public Win32Types.Rect ClientRect => _clientRect; public int 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 Win32Types.Rect _windowRect; private Win32Types.Rect _clientRect; private int _bmpDataSize; public bool Init(IntPtr handle) { _hWnd = handle; //获取窗口大小 if (!Win32Funcs.GetWindowRect(_hWnd, out _windowRect) || !Win32Funcs.GetClientRect(_hWnd, out _clientRect)) { return false; } _bmpDataSize = _windowRect.Width * _windowRect.Height * 3; _hScrDc = Win32Funcs.GetWindowDC(_hWnd); _hBitmap = Win32Funcs.CreateCompatibleBitmap(_hScrDc, _windowRect.Width, _windowRect.Height); _hMemDc = Win32Funcs.CreateCompatibleDC(_hScrDc); _hOldBitmap = Win32Funcs.SelectObject(_hMemDc, _hBitmap); return true; } public bool Init(string windowName) { var handle = Win32Funcs.FindWindow(null, windowName); if (handle.Equals(IntPtr.Zero)) { return false; } return Init(handle); } public void 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; } public bool RefreshWindow() { return ChangeWindowHandle(_hWnd); } public bool ChangeWindowHandle(string windowName) { Cleanup(); return Init(windowName); } public bool ChangeWindowHandle(IntPtr handle) { Cleanup(); return Init(handle); } public IntPtr Capture() { if (_hMemDc.Equals(IntPtr.Zero) || _hScrDc.Equals(IntPtr.Zero)) { return IntPtr.Zero; } var ret = Win32Funcs.PrintWindow(_hWnd, _hMemDc, (uint) Win32Consts.PrintWindowMode.PW_CLIENTONLY | (uint) Win32Consts.PrintWindowMode.PW_RENDERFULLCONTENT); return ret ? _hBitmap : IntPtr.Zero; } public bool Capture(out IntPtr bitsPtr, out int bufferSize, out Win32Types.Rect rect) { bitsPtr = _hBitmap; bufferSize = _bmpDataSize; rect = _clientRect; if (_hBitmap.Equals(IntPtr.Zero) || _hMemDc.Equals(IntPtr.Zero) || _hScrDc.Equals(IntPtr.Zero)) { return false; } var ret = Win32Funcs.PrintWindow(_hWnd, _hMemDc, (uint) Win32Consts.PrintWindowMode.PW_CLIENTONLY | (uint) Win32Consts.PrintWindowMode.PW_RENDERFULLCONTENT); return ret; } } }
内容总结
以上是互联网集市为您收集整理的C#使用PrintWindow进行窗口抓图全部内容,希望文章能够帮你解决C#使用PrintWindow进行窗口抓图所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。
来源:【匿名】