zoukankan      html  css  js  c++  java
  • C#使用PrintWindow进行窗口抓图

    本文和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;
            }
        }
    }
  • 相关阅读:
    蓝桥杯历届试题 打印十字图 文字图形
    Cuckoo Hashing
    2006 飞行员配对(二分图最大匹配)
    Bad Hair Day(求数组中元素和它后面离它最近元素之间的元素个数)
    2019CCPC江西省赛
    字典树系统学习
    ac自动机学习
    项目管理(把与某点相邻边分为两类 是复杂度降为(n^(3/2))
    Ultra-QuickSort(离散化)
    Chika and Friendly Pairs(莫队+树状数组+离散化+预处理上下界)
  • 原文地址:https://www.cnblogs.com/xhubobo/p/12789482.html
Copyright © 2011-2022 走看看