我正在开发一个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应用程序并在后台运行时,请保持此screencapture应用程序运行。它在wpf应用程序的背景中截取窗口的屏幕截图。我想要显示器上当前视图的屏幕截图。
请帮帮我。
答案 0 :(得分: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();
答案 1 :(得分: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功能。
答案 2 :(得分: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");
答案 3 :(得分:1)
看看这个:How to: Create a Bitmap from a Visual应该是最容易从WPF Visual获取图像。