Я пытаюсь создать программу, которая делает снимок экрана и отображает его в форме WPF.
Я пытаюсь получить не менее 30 кадров в секунду, но у меня проблема с производительностью.
Я получаю снимок экрана с помощью CopyFromScreen, а затем обрабатываю его для отображения на элементе управления изображением.
Всякий раз, когда я запускаю программу, мышь кажется «тяжелой» или она становится менее чувствительной.
Исходя из моих наблюдений, загрузка процессора возрастает всякий раз, когда я вызываю функцию.
Как мне достичь 30 FPS? Я читал о WriteableBitmap, но не могу понять, как включить его в свой текущий код. Вот мой текущий код:
private void ScreenCapture(object sender, EventArgs e)
{
System.GC.Collect();
using (Bitmap backgroundImage = new Bitmap(this.auxScreen.Bounds.Width, this.auxScreen.Bounds.Height))
{
using (Graphics gBackgroundImage = Graphics.FromImage(backgroundImage))
{
gBackgroundImage.CopyFromScreen(this.auxScreen.Bounds.X, this.auxScreen.Bounds.Y, 0, 0, backgroundImage.Size);
if (MainWindowValues.Instance.CurrentMode == MainWindowValues.Modes.PM_Duplicate)
{
CURSORINFO pci;
pci.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(CURSORINFO));
if (GetCursorInfo(out pci))
{
if (pci.flags == CURSOR_SHOWING)
{
DrawIcon(gBackgroundImage.GetHdc(), Mouse.Instance.Position.X, Mouse.Instance.Position.Y, pci.hCursor);
gBackgroundImage.ReleaseHdc();
}
}
}
handleBG = backgroundImage.GetHbitmap();
ImageSource bground = Imaging.CreateBitmapSourceFromHBitmap(handleBG, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
ImageContainer.Dispatcher.Invoke(() => ImageContainer.Source = bground);
gBackgroundImage.Dispose();
DeleteObject(handleBG);
}
backgroundImage.Dispose();
}
System.GC.WaitForPendingFinalizers();
}
Спасибо!