123 lines
3.7 KiB
C#
123 lines
3.7 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Net.Http;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using static ScreenCapture.NativeMethods;
|
|
|
|
namespace ScreenCapture
|
|
{
|
|
sealed class ScreenCapture
|
|
{
|
|
#region Singleton
|
|
private static ScreenCapture instance;
|
|
|
|
public static ScreenCapture Instance
|
|
{
|
|
get
|
|
{
|
|
instance = instance ?? new ScreenCapture();
|
|
return instance;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
private readonly static EncoderParameters encParamsJPG = new EncoderParameters();
|
|
private readonly static ImageCodecInfo codecJPG = GetEncoderInfo(ImageFormat.Jpeg);
|
|
private readonly static ImageCodecInfo codecPNG = GetEncoderInfo(ImageFormat.Png);
|
|
|
|
public string FileName { get; private set; }
|
|
public MemoryStream Stream { get; private set; }
|
|
|
|
private ScreenCapture()
|
|
{
|
|
encParamsJPG.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90L);
|
|
}
|
|
|
|
public void CaptureWindow()
|
|
{
|
|
Capture(CurrentWindow);
|
|
}
|
|
|
|
public void Release()
|
|
{
|
|
Stream.Close();
|
|
Stream.Dispose();
|
|
FileName = null;
|
|
}
|
|
|
|
private Rectangle CurrentWindow
|
|
{
|
|
get
|
|
{
|
|
IntPtr window = GetForegroundWindow();
|
|
Rect rect = new Rect();
|
|
GetWindowRect(window, ref rect);
|
|
StringBuilder sb = new StringBuilder(255);
|
|
GetWindowText(window, sb, sb.Capacity);
|
|
FileName = sanitizeFileName(sb.ToString()) + "_" + DateTime.Now.Ticks + ".";
|
|
return new Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top);
|
|
}
|
|
}
|
|
|
|
private void Capture(Rectangle bounds)
|
|
{
|
|
using (Bitmap image = new Bitmap(bounds.Width, bounds.Height))
|
|
{
|
|
using (Graphics g = Graphics.FromImage(image))
|
|
{
|
|
g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
|
|
}
|
|
Stream = BestStream(image);
|
|
Stream.Seek(0, SeekOrigin.Begin);
|
|
}
|
|
}
|
|
|
|
private MemoryStream BestStream(Bitmap image)
|
|
{
|
|
MemoryStream png = WriteToMemory(image, codecPNG, null);
|
|
MemoryStream jpg = WriteToMemory(image, codecJPG, encParamsJPG);
|
|
|
|
if (png.Length <= jpg.Length)
|
|
{
|
|
FileName += "png";
|
|
jpg.Close();
|
|
jpg.Dispose();
|
|
return png;
|
|
}
|
|
else
|
|
{
|
|
FileName += "jpg";
|
|
png.Close();
|
|
png.Dispose();
|
|
return jpg;
|
|
}
|
|
}
|
|
|
|
private static MemoryStream WriteToMemory(Bitmap image, ImageCodecInfo imageCodeInfo, EncoderParameters encoderParam)
|
|
{
|
|
MemoryStream mt = new MemoryStream();
|
|
image.Save(mt, imageCodeInfo, encoderParam);
|
|
return mt;
|
|
}
|
|
|
|
private static ImageCodecInfo GetEncoderInfo(ImageFormat format)
|
|
{
|
|
return ImageCodecInfo.GetImageEncoders().First(codec =>
|
|
{
|
|
return codec.FormatID == format.Guid;
|
|
});
|
|
}
|
|
|
|
|
|
private static string sanitizeFileName(string str)
|
|
{
|
|
return Regex.Replace(String.Join("_", str.Split(Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries)).TrimEnd('.'), @"[^\u0000-\u007F]", string.Empty);
|
|
}
|
|
}
|
|
}
|