PrintScreen Исходный код / ​​Моделирование - PullRequest
0 голосов
/ 31 августа 2011

Я бы хотел сфотографировать полноэкранную игру Direct3D. Я знаю, что мне нужно создать «оверлей», который сложнее в c #, и я обнаружил, что использование printscreen (и его вставка в mspaint) захватывает окно игры.

Я получил этот нестабильный код:

            try
            {
                SendKeys.SendWait("{PRTSC}");
                Thread.Sleep(100);
                if (Clipboard.ContainsImage())
                    return Clipboard.GetImage();
            }
            catch (Exception)
            {
                throw;
            }
            Bitmap bitmap = new Bitmap(1, 1);
            return bitmap;

Этот код иногда работает, иногда он генерирует ExternalException, а иногда и Clipboard.ContainsImage () возвращает false, и он просто возвращает изображение размером 1,1.

Я хотел бы попытаться улучшить этот код, чтобы мне не пришлось полагаться на время, необходимое для копирования чего-либо в буфер обмена (с помощью thread.sleep (20000) это будет работать, но этот код просто часть большего кода, который выполняется каждые 800 мс).

Так что мне нужны идеи о том, как более надежно отправить ключи или получить тот метод, который использует printscreen.

1 Ответ

0 голосов
/ 31 августа 2011
public static class Win32
{
    [DllImport("User32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);
}

public Bitmap CaptureWindow()
{
    Bitmap bmp = new Bitmap(this.Width,this.Height);
    using (Graphics g = Graphics.FromImage(bmp))
    {
        Win32.PrintWindow(this.Handle, g.GetHdc(), 0);
        g.ReleaseHdc();
    }
    return bmp;
}
...