Самый быстрый способ поймать экран? Любой Язык

Очень интересно: как только я преобразовал запрос в представление и запустил select * from myview, запрос был очень быстрым. План запроса объяснения теперь имеет следующий результат:

id  parent  notused detail
3   0   0   MATERIALIZE 2
7   3   0   SEARCH TABLE logs USING INDEX i_Logs (Code=?)
44  0   0   MATERIALIZE 3
48  44  0   SEARCH TABLE logs USING INDEX i_Logs (Code=?)
92  0   0   SEARCH TABLE logs USING INDEX i_Logs (Code=?)
112 0   0   SEARCH SUBQUERY 2 AS b USING AUTOMATIC COVERING INDEX (SessionID=?)
140 0   0   SEARCH SUBQUERY 3 AS c USING AUTOMATIC COVERING INDEX (SessionID=?)
157 0   0   USE TEMP B-TREE FOR GROUP BY
259 0   0   USE TEMP B-TREE FOR ORDER BY

Я не уверен, почему EQP изменился, когда я вместо этого использую представление, но я очень счастлив, потому что он работает отлично и очень быстро: - )

Большое спасибо @Carlos Cavero за форматирование моего кода.

6
задан Daniel Rikowski 13 April 2009 в 15:27
поделиться

2 ответа

Многие программы используют драйвер и позволяет вашему приложению подключаться к процедурам отображения нижнего уровня. Я не совсем уверен, как это сделать, но это возможно. Вот отправная точка при написании драйвера для Windows. http://msdn.microsoft.com/en-us/library/ms809956.aspx

Вот что я только что нашел через Google: http://www.hmelyoff.com/index.php?section=17

1
ответ дан 17 December 2019 в 20:34
поделиться

Вы, вероятно, хотите использовать что-то вроде Camtasia . Зависит от того, почему вы делаете видео.

Я использую переписанную версию удобной для пользователя обработки исключений Джеффа , и он использует BitBlt из GDI для захвата скриншотов. Мне это кажется достаточно быстрым, но я не тестировал его, и мы просто используем его для единичных снимков, когда выдается необработанное исключение.

#region Win32 API screenshot calls

// Win32 API calls necessary to support screen capture
[DllImport("gdi32", EntryPoint = "BitBlt", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int BitBlt(int hDestDC, int x, int y, int nWidth, int nHeight, int hSrcDC, int xSrc,
                                 int ySrc, int dwRop);

[DllImport("user32", EntryPoint = "GetDC", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int GetDC(int hwnd);

[DllImport("user32", EntryPoint = "ReleaseDC", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int ReleaseDC(int hwnd, int hdc);

#endregion

private static ImageFormat screenshotImageFormat = ImageFormat.Png;

/// <summary>
/// Takes a screenshot of the desktop and saves to filename and format specified
/// </summary>
/// <param name="fileName"></param>
private static void TakeScreenshotPrivate(string fileName)
{
    Rectangle r = Screen.PrimaryScreen.Bounds;

    using (Bitmap bitmap = new Bitmap(r.Right, r.Bottom))
    {
        const int SRCCOPY = 13369376;

        using (Graphics g = Graphics.FromImage(bitmap))
        {
            // Get a device context to the windows desktop and our destination  bitmaps
            int hdcSrc = GetDC(0);
            IntPtr hdcDest = g.GetHdc();

            // Copy what is on the desktop to the bitmap
            BitBlt(hdcDest.ToInt32(), 0, 0, r.Right, r.Bottom, hdcSrc, 0, 0, SRCCOPY);

            // Release device contexts
            g.ReleaseHdc(hdcDest);
            ReleaseDC(0, hdcSrc);

            string formatExtension = screenshotImageFormat.ToString().ToLower();
            string expectedExtension = string.Format(".{0}", formatExtension);

            if (Path.GetExtension(fileName) != expectedExtension)
            {
                fileName += expectedExtension;
            }

            switch (formatExtension)
            {
                case "jpeg":
                    BitmapToJPEG(bitmap, fileName, 80);
                    break;
                default:
                    bitmap.Save(fileName, screenshotImageFormat);
                    break;
            }

            // Save the complete path/filename of the screenshot for possible later use
            ScreenshotFullPath = fileName;
        }
    }
}

/// <summary>
/// Save bitmap object to JPEG of specified quality level
/// </summary>
/// <param name="bitmap"></param>
/// <param name="fileName"></param>
/// <param name="compression"></param>
private static void BitmapToJPEG(Image bitmap, string fileName, long compression)
{
    EncoderParameters encoderParameters = new EncoderParameters(1);
    ImageCodecInfo codecInfo = GetEncoderInfo("image/jpeg");

    encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, compression);
    bitmap.Save(fileName, codecInfo, encoderParameters);
}
1
ответ дан 17 December 2019 в 20:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: