zoukankan      html  css  js  c++  java
  • WPF使用Win32进行GDI截屏笔记

    1、新建项目,并为项目添加引用:

    System.Drawing

    3、添加一个类,命名空间自定:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    
    namespace HJess
    {
        public class ScreenDevice
        {
            public const int SM_CXSCREEN = 0;
            public const int SM_CYSCREEN = 1;
            public const int SRCCOPY = 13369376;
    
            [DllImport("gdi32.dll", EntryPoint = "DeleteDC")]
            public static extern IntPtr DeleteDC(IntPtr hDc);
    
            [DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
            public static extern IntPtr DeleteObject(IntPtr hDc);
    
            [DllImport("gdi32.dll", EntryPoint = "BitBlt")]
            public static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, int RasterOp);
    
            [DllImport("gdi32.dll", EntryPoint = "CreateCompatibleBitmap")]
            public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
    
            [DllImport("gdi32.dll", EntryPoint = "CreateCompatibleDC")]
            public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
    
            [DllImport("gdi32.dll", EntryPoint = "SelectObject")]
            public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
    
            [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
            public static extern IntPtr GetDesktopWindow();
    
            [DllImport("user32.dll", EntryPoint = "GetDC")]
            public static extern IntPtr GetDC(IntPtr ptr);
    
            [DllImport("user32.dll", EntryPoint = "GetSystemMetrics")]
            public static extern int GetSystemMetrics(int abc);
    
            [DllImport("user32.dll", EntryPoint = "GetWindowDC")]
            public static extern IntPtr GetWindowDC(Int32 ptr);
    
            [DllImport("user32.dll", EntryPoint = "ReleaseDC")]
            public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);
    
            /**
             * 尺寸
             * 
             */
            public struct SIZE
            {
                public int cx;
                public int cy;
            }
    
            /**
             * 获取屏幕解图
             */
            public static Bitmap GetDesktopImage()
            {
                //保存截屏的尺寸
                SIZE size;
                //指向bitmap的句柄
                IntPtr hBitmap;
                //通过GetDC函数获得指向桌面设备上下文的句柄
                IntPtr hDC = GetDC(GetDesktopWindow());
                //在内存中创建一个兼容的设备上下文
                IntPtr hMemDC = CreateCompatibleDC(hDC);
                //传递一个常数到GetSystemMetrics,并返回屏幕的x坐标
                size.cx = GetSystemMetrics(0);
                //传递一个常数到GetSystemMetrics,并返回屏幕的y坐标
                size.cy = GetSystemMetrics(1);
                //创建与指定的设备环境相关的设备兼容的位图。
                hBitmap = CreateCompatibleBitmap(hDC, size.cx, size.cy);
                //As hBitmap is IntPtr we can not check it against null. For this purspose IntPtr.Zero is used.
                if (hBitmap != IntPtr.Zero)
                {
                    //Here we select the compatible bitmap in memeory device context and keeps the refrence to Old bitmap.
                    IntPtr hOld = (IntPtr)SelectObject(hMemDC, hBitmap);
                    //We copy the Bitmap to the memory device context.
                    BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, SRCCOPY);
                    //We select the old bitmap back to the memory device context.
                    SelectObject(hMemDC, hOld);
                    //We delete the memory device context.
                    DeleteDC(hMemDC);
                    //We release the screen device context.
                    ReleaseDC(GetDesktopWindow(), hDC);
                    //Image is created by Image bitmap handle and stored in local variable.
                    Bitmap bmp = System.Drawing.Image.FromHbitmap(hBitmap);
                    //Release the memory for compatible bitmap.
                    DeleteObject(hBitmap);
                    //This statement runs the garbage collector manually.
                    GC.Collect();
                    //Return the bitmap
                    return bmp;
                }
                //If hBitmap is null retunrn null.
                return null;
            }
        }
    }

    4、获取截屏结果

                Bitmap bitmap = ScreenDevice.GetDesktopImage();
                IntPtr ip = bitmap.GetHbitmap();//从GDI+ Bitmap创建GDI位图对象
                //Imaging.CreateBitmapSourceFromHBitmap方法,基于所提供的非托管位图和调色板信息的指针,返回一个托管的BitmapSource
                BitmapSource bitmapSource = System.Windows.Interop.Imaging
                    .CreateBitmapSourceFromHBitmap(ip, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
                image1.Source = bitmapSource;

    完工!

  • 相关阅读:
    sqlserver中判断表或临时表是否存在
    Delphi 简单方法搜索定位TreeView项
    hdu 2010 水仙花数
    hdu 1061 Rightmost Digit
    hdu 2041 超级楼梯
    hdu 2012 素数判定
    hdu 1425 sort
    hdu 1071 The area
    hdu 1005 Number Sequence
    hdu 1021 Fibonacci Again
  • 原文地址:https://www.cnblogs.com/halfmanhuang/p/7048008.html
Copyright © 2011-2022 走看看