【问题标题】:C# ScreenCapture [duplicate]C# ScreenCapture [重复]
【发布时间】:2019-10-15 12:14:52
【问题描述】:

我正在尝试使用 Visual Studio 12(抱歉,我们必须使用 12)和 C# 来捕获屏幕。 我在这里找到了一个算法:Capture screenshot of active window?

 ScreenCapture sc = new ScreenCapture();

我尝试了这个并收到一条错误消息,指出找不到类型或命名空间。 这并不意外。我想我只需要在顶部添加另一个“使用...”声明。 我试图搜索要“使用”哪个包以获取 ScreenCapture(),但我空手而归。有人知道吗?

【问题讨论】:

标签: c# screenshot


【解决方案1】:

我认为这可能会给你一个关于 using System.Runtime.InteropServices; 的错误

需要添加DLL System.Runtime.InteropServices的引用

【讨论】:

    【解决方案2】:

    这个库在 NuGet 上似乎不存在。但是,您可以在 Developer Fusion 找到它。

    下载部分仅包含一个具有以下类的 zip 文件,您可以将其复制粘贴到您的 VS 项目中

    using System;
    using System.Runtime.InteropServices;
    using System.Drawing;
    using System.Drawing.Imaging;
    
    namespace ScreenShotDemo
    {
        /// <summary>
        /// Provides functions to capture the entire screen, or a particular window, and save it to a file.
        /// </summary>
        public class ScreenCapture
        {
            /// <summary>
            /// Creates an Image object containing a screen shot of the entire desktop
            /// </summary>
            /// <returns></returns>
            public Image CaptureScreen() 
            {
                return CaptureWindow( User32.GetDesktopWindow() );
            }
    
            /// <summary>
            /// Creates an Image object containing a screen shot of a specific window
            /// </summary>
            /// <param name="handle">The handle to the window. (In windows forms, this is obtained by the Handle property)</param>
            /// <returns></returns>
            public Image CaptureWindow(IntPtr handle)
            {
                // get te hDC of the target window
                IntPtr hdcSrc = User32.GetWindowDC(handle);
                // 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);
                // 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>
            /// Captures a screen shot of a specific window, and saves it to a file
            /// </summary>
            /// <param name="handle"></param>
            /// <param name="filename"></param>
            /// <param name="format"></param>
            public void CaptureWindowToFile(IntPtr handle, string filename, ImageFormat format) 
            {
                Image img = CaptureWindow(handle);
                img.Save(filename,format);
            }
    
            /// <summary>
            /// Captures a screen shot of the entire desktop, and saves it to a file
            /// </summary>
            /// <param name="filename"></param>
            /// <param name="format"></param>
            public void CaptureScreenToFile(string filename, ImageFormat format) 
            {
                Image img = CaptureScreen();
                img.Save(filename,format);
            }
    
            /// <summary>
            /// Helper class containing Gdi32 API functions
            /// </summary>
            private class GDI32
            {
    
                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>
            private 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);
    
            }
    
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      根据documentation,您需要使用Windows.Media.Capture。请注意

      重要

      仅运行 Windows Phone 8.1 的移动设备支持 ScreenCapture 功能。 Windows 10 不支持此 API。

      您可以查看this answer,它适用于所有 Windows 桌面平台。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-12
        • 1970-01-01
        • 2012-11-20
        • 2022-01-26
        • 2020-10-18
        • 2014-03-07
        相关资源
        最近更新 更多