Initial commit

This commit is contained in:
2025-06-17 00:24:42 +02:00
commit fbf9152128
3 changed files with 118 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
.vs
bin
obj

104
WindowCapture.cs Normal file
View File

@@ -0,0 +1,104 @@
using System;
using System.Drawing;
using System.Runtime.InteropServices;
class Program {
[StructLayout(LayoutKind.Sequential)]
private struct RECT {
public int Left;
public int Top;
public int Right;
public int Bottom;
}
[DllImport("user32.dll")]
private static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern int GetClientRect(IntPtr hWnd, out RECT rect);
[DllImport("user32.dll")]
private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("gdi32.dll")]
private static extern IntPtr CreateCompatibleDC(IntPtr hDC);
[DllImport("gdi32.dll")]
private static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int width,
int height);
[DllImport("gdi32.dll")]
private static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
[DllImport("gdi32.dll")]
private static extern bool DeleteObject(IntPtr hObject);
[DllImport("gdi32.dll")]
private static extern bool DeleteDC(IntPtr hDC);
[DllImport("user32.dll")]
private static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt,
uint nFlags);
private const uint PW_RENDERFULLCONTENT = 0x00000002;
static bool CaptureWindow(IntPtr windowHandle, string outputPath) {
try {
// Get the window dimensions
GetClientRect(windowHandle, out RECT windowRect);
int width = windowRect.Right - windowRect.Left;
int height = windowRect.Bottom - windowRect.Top;
// Create compatible DC and bitmap
IntPtr sourceContext = GetDC(windowHandle);
IntPtr destContext = CreateCompatibleDC(sourceContext);
IntPtr bitmap = CreateCompatibleBitmap(sourceContext, width, height);
// Select the bitmap into the DC
IntPtr oldBitmap = SelectObject(destContext, bitmap);
// Use PrintWindow to capture the window content
PrintWindow(windowHandle, destContext, PW_RENDERFULLCONTENT);
// Create the final bitmap
using (Bitmap screenshot = Bitmap.FromHbitmap(bitmap)) {
screenshot.Save(outputPath, System.Drawing.Imaging.ImageFormat.Png);
}
// Clean up
SelectObject(destContext, oldBitmap);
DeleteObject(bitmap);
DeleteDC(destContext);
ReleaseDC(windowHandle, sourceContext);
return true;
} catch (Exception) {
return false;
}
}
static int Main(string[] args) {
if (args.Length != 2) {
Console.WriteLine(
"Usage: WindowCapture.exe <window_handle> <output_path>");
Console.WriteLine("Example: WindowCapture.exe 123456 screenshot.png");
return 1;
}
if (!IntPtr.TryParse(args[0], out IntPtr windowHandle)) {
Console.WriteLine(
"Invalid window handle. Please provide a valid number.");
return 1;
}
string outputPath = args[1];
if (CaptureWindow(windowHandle, outputPath)) {
Console.WriteLine($"Screenshot saved to: {outputPath}");
return 0;
} else {
Console.WriteLine("Failed to capture screenshot");
return 1;
}
}
}

11
WindowCapture.csproj Normal file
View File

@@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Drawing.Common" Version="9.0.6" />
</ItemGroup>
</Project>