Ich versuche, eine einfache Videoaufnahme eines bestimmten Fensters zu erstellen, indem ein Screenshot des Fensters alle x
Millisekunden (kombinieren Sie dann alle diese Bilder in einer AVI-Datei), aber ich nicht wie zu definieren der Wert x
. Wie definiere ich es? Wofür wird ein gemeinsamer Wert verwendet? Ich habe etwas über 24fps gelesen.Erstellen einer Bildschirmaufnahme
Ich bin mir auch nicht sicher, ob die Verwendung einer Timer
, die Aufnahme in der Tick
Veranstaltung ist eine gute Idee. Habe ich irgendeine Art von Ungenauigkeit und ich sollte etwas anderes verwenden? Beispielsweise dauert der Screenshot aus irgendeinem Grund länger als erwartet.
Meine aktuelle Implementierung ist wie folgt:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT r);
public Bitmap GetScreenshot(IntPtr hwnd)
{
RECT rc;
if (!GetWindowRect(hwnd, out rc))
throw new Win32Exception(Marshal.GetLastWin32Error());
Bitmap bmp = new Bitmap(rc.right - rc.left, rc.bottom - rc.top, PixelFormat.Format32bppArgb);
using (var gfxBmp = Graphics.FromImage(bmp))
{
IntPtr hdcBitmap = gfxBmp.GetHdc();
bool succeeded = PrintWindow(hwnd, hdcBitmap, 0);
gfxBmp.ReleaseHdc(hdcBitmap);
if (!succeeded)
{
gfxBmp.FillRectangle(new SolidBrush(Color.Gray), new Rectangle(Point.Empty, bmp.Size));
}
IntPtr hRgn = CreateRectRgn(0, 0, 0, 0);
GetWindowRgn(hwnd, hRgn);
Region region = Region.FromHrgn(hRgn);
if (!region.IsEmpty(gfxBmp))
{
gfxBmp.ExcludeClip(region);
gfxBmp.Clear(Color.Transparent);
}
return bmp;
}
}
und
int i = 0;
const string dest_path = @"C:\Users\pc2\Desktop\images";
void doRecord()
{
string filename = Path.Combine(dest_path, string.Format("{0}.png", ++i));
// yeah, I'll add some error checking here soon as it gets working.
GetScreenshot(handle).Save(filename, ImageFormat.Png);
}
und in der Zecke-Ereignis des Timer Ich nenne es:
private void timer1_Tick(object sender, EventArgs e)
{
doRecord();
}
auch, wie man richtig definieren, um Wert von x
, fehle ich etwas?
Ich hatte eine ähnliche Herausforderung und die gefundene Lösung war es, die Bilder in den Speicher zu senden, dann einen anderen Thread ziehen ein Bild in Abständen. Ja, es ist * hacky * aber meine Timeline war perfekt für die Aufnahme. Hoffentlich hilft das! – Spencer