Я тут как-то писал про программу скриншотов, которая компилируется сама из bat файла. Немного изменив ту программу я сделал другую программу, которая при запуске делает скриншот экрана и сохраняет его на диске D в папке screens текущий год, месяц, и день, а само название файла - это текущее время. Для начала нужно узнать текущую дату и время:
Формат времени заглавные HH - это часы в 24 часовой формате текущего времени. MM - это текущий месяц в дате, не путать с маленькими mm - это для минут во времени.
Ну а дальше все остается как есть, но лишь удаляется лишнее: не нужна справка, не будем передавать в прогу аргументы, а так же, не нужна справка. В итоге вся прога будет такой:
static string timenow = DateTime.Now.ToString("HH_mm_ss");
static string yearnow = DateTime.Now.ToString("yyyy");
static string monthnow = DateTime.Now.ToString("MM");
static string datenow = DateTime.Now.ToString("_dd_");
Далее формируем путь из уже известных переменных:
static string path = "D:\\screens\\"+yearnow+"\\"+monthnow+"\\"+datenow+"\\";
Название файла - это полный путь + имя файла + расширение:
static String file = path+timenow+".jpg"; // если нужен другой формат то поменяйте на нужный из bmp,emf, exif, jpg, jpeg, gif, png, tiff, wmf
static String file = path+timenow+".jpg"; // если нужен другой формат то поменяйте на нужный из bmp,emf, exif, jpg, jpeg, gif, png, tiff, wmf
В самом main создаем все папки, если папка уже имеется, то ничего не создается, а просто будет складываться в нее:
System.IO.Directory.CreateDirectory(path);
using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections.Generic;
using Microsoft.VisualBasic;
/// Provides functions to capture the entire screen, or a particular window, and save it to a file.
public class ScreenCapture
{
/// 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
private 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 void CaptureScreenToFile(string filename, ImageFormat format)
{
Image img = CaptureScreen();
img.Save(filename, format);
}
static string timenow = DateTime.Now.ToString("HH_mm_ss");
static string yearnow = DateTime.Now.ToString("yyyy");
static string monthnow = DateTime.Now.ToString("MM");
static string datenow = DateTime.Now.ToString("_dd_");
static string path = "D:\\screens\\"+yearnow+"\\"+monthnow+"\\"+datenow+"\\";
static bool fullscreen = true;
static String file = path+timenow+".jpg"; // если нужен другой формат то поменяй на нужный bmp,emf, exif, jpg, jpeg, gif, png, tiff, wmf
static System.Drawing.Imaging.ImageFormat format = System.Drawing.Imaging.ImageFormat.Jpeg; // тот же формат и тут в конце
public static void Main()
{
User32.SetProcessDPIAware();
System.IO.Directory.CreateDirectory(path);
ScreenCapture sc = new ScreenCapture();
try
{
sc.CaptureScreenToFile(file, format);
}
catch (Exception e)
{
//Console.WriteLine("Check if file path is valid " + file);
// Console.WriteLine(e.ToString());
}
}
/// 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);
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
public static extern int SetProcessDPIAware();
}
}
Весь этот код помещаем в батник, батник запускаем, и у нас создается скриншот в заданной папке, а так же экзешник с прогой.
Проблема в том, что на скринах довольно четко виднеется окно консоли - как от этого уйти я не придумал ничего лучше, чем по умолчанию сдвинуть окно в край и уменьшить его до 1 по горизонтали и вертикали - окно консоли таким образом почти не будет мешать. А если запускать программу из ярлыка то в нем можно указать что консоль запускать свернутой.
Сохранение выводимого в консоль текста в файл
ОтветитьУдалить// using System.IO;
Console.WriteLine(" --> " + returnData.ToString());
System.IO.File.WriteAllText("C:\\logs\\err_"+DateTime.Now.ToString("HHmmss")+".txt", " --> " + returnData.ToString());