C#根据句柄获取窗口截图
时间: 2024-09-20 09:18:23 浏览: 98
在C#中,你可以使用Windows API来获取窗口的屏幕截图。这通常通过`System.Drawing`和`DllImport`特性来实现,因为这两个库允许你直接调用底层的Windows函数。首先,你需要引用`System.Drawing.dll`和定义一些用于封装API调用的方法。下面是一个简化的示例:
```csharp
using System;
using System.Runtime.InteropServices;
using System.Drawing;
// 添加UnmanagedMemoryStream和Bitmap类型到命名空间
namespace System.IO
{
public class UnmanagedMemoryStream : Stream
{
// ... 省略实现
}
public sealed class Bitmap : Image
{
// ... 省略实现
}
}
[DllImport("user32.dll")]
private static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("gdi32.dll")]
private static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, uint nFlags);
[StructLayout(LayoutKind.Sequential)]
private struct COPY_RECTANGLE
{
public int left;
public int top;
public int right;
public int bottom;
}
public unsafe Bitmap CaptureWindowScreenshot(IntPtr hwnd)
{
try
{
IntPtr hdcSource = GetWindowDC(hwnd); // 获取窗口设备上下文
if (hdcSource == IntPtr.Zero)
throw new Win32Exception();
// 创建一个新的内存位图
int width = GetWindowRect(hwnd).right - GetWindowRect(hwnd).left;
int height = GetWindowRect(hwnd).bottom - GetWindowRect(hwnd).top;
using (var memStream = new UnmanagedMemoryStream())
{
var bitmap = new Bitmap(width, height);
IntPtr hdcBitmap = bitmap.GetHbitmap();
CopyRectangle cp = new COPY_RECTANGLE { left = 0, top = 0, right = width, bottom = height };
PrintWindow(hwnd, hdcBitmap, PW_CLIENTONLY | PW_NOBITMAP); // 打印窗口内容到内存位图
bitmap.CloneFromHbitmap(hdcBitmap, GraphicsUnit.Pixel); // 将内存位图复制回Bitmap
// 如果需要,可以在这里对位图进行进一步处理
bitmap.Save(memStream, ImageFormat.Png); // 示例保存为PNG
memStream.Seek(0, SeekOrigin.Begin);
return bitmap; // 返回捕获的截图
}
}
finally
{
if (hdcSource != IntPtr.Zero)
ReleaseDC(hwnd, hdcSource);
}
}
```
请注意,这个示例仅适用于截取指定窗口的内容,并可能需要处理异常。此外,为了使用这些API,你的应用程序需要有管理员权限。
阅读全文