0

我正在开发一个 Windows 应用程序,我想在其中截取整个窗口的屏幕截图。为此,我编写了以下代码:

Imports System.IO


Public Class ScreenCapture

    Public Sub GetJPG()
        Dim dt As DateTime = DateTime.Now
        Dim cdt As String = ""
        cdt = dt.ToString("dd MM yyyy HH:mm:ss")
        cdt = cdt.Replace(":", "_")
        cdt = cdt.Replace(" ", "_")

        Dim ScreenSize = SystemInformation.PrimaryMonitorSize

        Dim width As Integer = ScreenSize.Width
        Dim height As Integer = ScreenSize.Height

        Dim dir As DirectoryInfo = New DirectoryInfo("Screenshots")
        If Not dir.Exists Then dir = Directory.CreateDirectory(dir.FullName)
        Dim path As String = AppDomain.CurrentDomain.BaseDirectory

        Dim bitmap = New System.Drawing.Bitmap(ScreenSize.Width, ScreenSize.Height)
        Dim g = Graphics.FromImage(bitmap)
        g.CopyFromScreen(New Point(0, 0), New Point(0, 0), ScreenSize)
        g.Flush()

        Dim newbitmap = New System.Drawing.Bitmap(bitmap, width, height)

        Dim gr As Graphics = Graphics.FromImage(bitmap)
        gr.DrawImage(newbitmap, New Rectangle(0, 0, width, height), New Rectangle(0, 0, bitmap.Width, bitmap.Height), GraphicsUnit.Pixel)

        newbitmap.Save(path & "Screenshots\" & cdt & ".jpg", System.Drawing.Imaging.ImageFormat.Png)

    End Sub
End Class

当我运行 wpf 应用程序并在后台保持此屏幕捕获应用程序运行时。它在 wpf 应用程序的背景中截取窗口的屏幕截图。我想要显示器上当前视图的屏幕截图。

请帮我。

4

4 回答 4

1

试试这个:

[StructLayout(LayoutKind.Sequential)]
struct RECT
{
    public int left;
    public int top;
    public int right;
    public int bottom;
}

[DllImport(ExternDll.User32)]
public static extern IntPtr GetForegroundWindow();

[DllImport(ExternDll.User32, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetWindowRect(
    IntPtr hWnd,
    out RECT lpRect);

public static Rectangle GetWindowRect() // get bounds of active window
{
    RECT rect;

    GetWindowRect(GetForegroundWindow(), out rect);

    return new Rectangle(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
}

public static Bitmap GetScreenshot(Rectangle rect) // pass the result of GetWindowRect
{
    var screenshot = new Bitmap(rect.Width, rect.Height, PixelFormat.Format24bppRgb);

    using (var graphics = Graphics.FromImage(screenshot))
    {
        graphics.CopyFromScreen(rect.Location, Point.Empty, rect.Size);
    }

    return screenshot;
}

所有这些都会获得活动窗口的屏幕截图。

一些链接:

RECT结构 GetForegroundWindow函数和 GetWindowRect函数。

于 2013-09-18T11:18:49.347 回答
1

你可以试试下面的课。

public class ScreenShot
{
    public static void CaptureAndSave(int x, int y, int width, int height, string imagePath)
    {
        Bitmap myImage = ScreenShot.Capture(x, y, width, height);
        myImage.Save(imagePath, ImageFormat.Png);
    }

    private static Bitmap Capture(int x, int y, int width, int height)
    {            
        Bitmap screenShotBMP = new Bitmap(width, height, PixelFormat.Format32bppArgb);

        Graphics screenShotGraphics = Graphics.FromImage(screenShotBMP);

        screenShotGraphics.CopyFromScreen(new Point(x, y), Point.Empty, new Size(width, height), CopyPixelOperation.SourceCopy);
        screenShotGraphics.Dispose();

        return screenShotBMP;
    }
}

如何打电话

ScreenShot.CaptureAndSave(0, 0, ScreenSize.Width, ScreenSize.Height, @"D:\Capture.png");
于 2013-09-18T11:19:24.453 回答
1

看看这个:如何:从视觉创建位图应该是从 WPF 视觉获取图像的最简单方法。

于 2013-09-18T15:05:12.340 回答
1

这可能会帮助你..

using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;

namespace Cluster2
{
public class screen
{
    public void Main()
    {

        CaptureScreenToFile("C:\\temp1.gif", ImageFormat.Gif);
    }

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

    }

}
}

它将截取您当前关注的整个窗口的屏幕截图。此外,如果您将其用作单独的文件,例如 screen.cs,那么您应该在主 cs 文件中包含以下函数。

public class sshot : screen
{
    public void shot()
    {
        CaptureScreenToFile("C:\\Logs\\Screenshot" + DateTime.Now.ToString("ddMMyyyy") + ".jpg", System.Drawing.Imaging.ImageFormat.Png);
    }
}

现在在需要截图的情况下调用该函数..

 sshot ob = new sshot();     
 ob.shot();
于 2013-09-18T11:16:28.760 回答