/////////////////////////////////////////////////////////////////////////
//
// www.ultima.smoce.net
// Name: ScreenCapture
//
/////////////////////////////////////////////////////////////////////////
using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
using Phoenix;
using System.IO;
using System.Timers;
namespace ScreenCapture
{
///
/// Provides functions to capture the entire screen, or a particular window, and save it to a file.
///
public class ScreenCapture
{
private Timer timer = new Timer();
private bool fullScreen = false;
private bool running = false;
///
/// Creates an Image object containing a screen shot of the entire desktop
///
///
public Image CaptureScreen()
{
return CaptureWindow(User32.GetDesktopWindow());
}
///
/// Creates an Image object containing a screen shot of a specific window
///
/// The handle to the window. (In windows forms, this is obtained by the Handle property)
///
public Image CaptureWindow(IntPtr handle)
{
// get te 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;
}
public Image CaptureWindow(IntPtr handle, int width, int height)
{
//width += 3;
//height += 20;
// get te hDC of the target window
IntPtr hdcSrc = User32.GetWindowDC(handle);
// get the size
User32.RECT windowRect = new User32.RECT();
User32.GetWindowRect(handle, ref windowRect);
// 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, -5, -22, width + 5, height + 22, 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;
}
///
/// Captures a screen shot of a specific window, and saves it to a file
///
///
///
///
public void CaptureWindowToFile(IntPtr handle, string filename, ImageFormat format)
{
Image img = CaptureWindow(handle);
img.Save(filename, format);
}
///
/// Captures a screen shot of the entire desktop, and saves it to a file
///
///
///
public void CaptureWindowRectToFile(IntPtr handle, string filename, ImageFormat format, int width, int height)
{
Image img = CaptureWindow(handle, width, height);
img.Save(filename, format);
}
///
/// Captures a screen shot of the entire desktop, and saves it to a file
///
///
///
public void CaptureScreenToFile(string filename, ImageFormat format)
{
Image img = CaptureScreen();
img.Save(filename, format);
}
///
/// Helper class containing Gdi32 API functions
///
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);
}
///
/// Helper class containing User32 API functions
///
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);
}
[Command]
public void snap()
{
string obrName = "";
int lastObr = 0;
string lastObrStr = "";
string name;
int obrNum;
DirectoryInfo dir = new DirectoryInfo(Phoenix.Core.Directory + "Obrazky");
if (!dir.Exists) dir.Create();
FileInfo[] obrazky = dir.GetFiles();
foreach (FileInfo info in obrazky)
{
name = info.Name;
if (name.Contains("Obrazek"))
try
{
obrNum = Convert.ToInt32(name.Substring(7, 5));
if (lastObr < obrNum)
{
lastObr = obrNum;
}
}
catch
{
}
}
lastObr++;
for (int i = lastObr.ToString().Length; i < 5; i++)
{
lastObrStr += "0";
}
lastObrStr += lastObr.ToString();
obrName = "Obrazek" + lastObrStr + ".jpg";
ScreenCapture sc = new ScreenCapture();
sc.CaptureWindowToFile(Client.HWND, Phoenix.Core.Directory + "Obrazky" + obrName, ImageFormat.Jpeg);
UO.PrintWarning("Screenshot: " + obrName);
}
[Command]
public void snap(string filename)
{
string obrName = "";
int lastObr = 0;
string lastObrStr = "";
string name;
int obrNum;
DirectoryInfo dir = new DirectoryInfo(Phoenix.Core.Directory + "Obrazky");
if (!dir.Exists) dir.Create();
FileInfo[] obrazky = dir.GetFiles();
foreach (FileInfo info in obrazky)
{
name = info.Name;
if (name.Contains(filename))
try
{
obrNum = Convert.ToInt32(name.Substring(filename.Length, 5));
if (lastObr < obrNum)
{
lastObr = obrNum;
}
}
catch
{
}
}
lastObr++;
for (int i = lastObr.ToString().Length; i < 5; i++)
{
lastObrStr += "0";
}
lastObrStr += lastObr.ToString();
obrName = filename + lastObrStr + ".jpg";
ScreenCapture sc = new ScreenCapture();
sc.CaptureWindowToFile(Client.HWND, Phoenix.Core.Directory + "Obrazky" + obrName, ImageFormat.Jpeg);
UO.PrintWarning("Screenshot: " + obrName);
}
[Command]
public void snapScreen()
{
string obrName = "";
int lastObr = 0;
string lastObrStr = "";
string name;
int obrNum;
DirectoryInfo dir = new DirectoryInfo(Phoenix.Core.Directory + "Obrazky");
if (!dir.Exists) dir.Create();
FileInfo[] obrazky = dir.GetFiles();
foreach (FileInfo info in obrazky)
{
name = info.Name;
if (name.Contains("Obrazek"))
try
{
obrNum = Convert.ToInt32(name.Substring(7, 5));
if (lastObr < obrNum)
{
lastObr = obrNum;
}
}
catch
{
}
}
lastObr++;
for (int i = lastObr.ToString().Length; i < 5; i++)
{
lastObrStr += "0";
}
lastObrStr += lastObr.ToString();
obrName = "Obrazek" + lastObrStr + ".jpg";
ScreenCapture sc = new ScreenCapture();
sc.CaptureWindowRectToFile(Client.HWND, Phoenix.Core.Directory + "Obrazky" + obrName, ImageFormat.Jpeg, 800, 600);
UO.PrintWarning("Screenshot: " + obrName);
}
[Command]
public void autosnap()
{
if (running)
{
timer.Elapsed -= timer_Elapsed;
running = false;
UO.PrintWarning("Autosnap vypnut!");
}
else
{
UO.PrintWarning("Autosnap se zapina ,autosnap interval true/false! [true - fullscreen, false - vyrez hry (800x600)]");
}
}
[Command]
public void autosnap(int interval, bool fullscreen)
{
if (running)
{
timer.Elapsed -= timer_Elapsed;
running = false;
UO.PrintWarning("Autosnap vypnut!");
}
else
{
timer.Interval = interval;
this.fullScreen = fullscreen;
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Start();
running = true;
UO.PrintWarning("Autosnap zapnut!");
}
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (fullScreen)
{
snap();
}
else
{
snapScreen();
}
}
}
}