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

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
         );

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
可以使用C#中的System.Drawing.Bitmap类和Win32 API来获取窗口截图。具体的代码如下: ```csharp using System; using System.Drawing; using System.Runtime.InteropServices; public class WindowCapture { [DllImport("User32.dll")] public static extern IntPtr GetDC(IntPtr hwnd); [DllImport("User32.dll")] public static extern void ReleaseDC(IntPtr hwnd, IntPtr dc); [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleBitmap(IntPtr dc, int width, int height); [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleDC(IntPtr dc); [DllImport("gdi32.dll")] public static extern IntPtr SelectObject(IntPtr dc, IntPtr obj); [DllImport("gdi32.dll")] public static extern bool BitBlt(IntPtr dcDest, int xDest, int yDest, int wDest, int hDest, IntPtr dcSrc, int xSrc, int ySrc, int rasterOp); public static Bitmap CaptureWindow(IntPtr hwnd) { // 获取窗口的设备上下文 IntPtr hdcSrc = GetDC(hwnd); if (hdcSrc == IntPtr.Zero) { return null; } // 创建一个兼容的设备上下文和位图 IntPtr hdcDest = CreateCompatibleDC(hdcSrc); IntPtr hbmDest = CreateCompatibleBitmap(hdcSrc, 100, 100); if (hdcDest == IntPtr.Zero || hbmDest == IntPtr.Zero) { ReleaseDC(hwnd, hdcSrc); return null; } // 将位图选入设备上下文 IntPtr hbmOld = SelectObject(hdcDest, hbmDest); // 复制窗口的内容到位图中 if (!BitBlt(hdcDest, 0, 0, 100, 100, hdcSrc, 0, 0, 0x00CC0020)) { SelectObject(hdcDest, hbmOld); DeleteObject(hbmDest); DeleteDC(hdcDest); ReleaseDC(hwnd, hdcSrc); return null; } // 恢复设备上下文并释放资源 SelectObject(hdcDest, hbmOld); DeleteObject(hbmDest); DeleteDC(hdcDest); ReleaseDC(hwnd, hdcSrc); // 返回位图 return Bitmap.FromHbitmap(hbmDest); } } ``` 使用方法: ```csharp IntPtr hwnd = // 窗口句柄 Bitmap bmp = WindowCapture.CaptureWindow(hwnd); ``` 其中,hwnd为窗口句柄,bmp为获取到的窗口截图。请注意,此代码仅支持获取窗口的静态截图,无法实时获取窗口的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值