Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Не пойму почему BitBlt не срабатывает


Автор: Ch0bits 6.4.2006, 01:49
САБЖ
Код

class ScreenMaker
    {
        [DllImport("user32.dll")]
        static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

        [DllImport("user32.dll")]
        static extern IntPtr GetDC(IntPtr hWnd);

        [DllImport("gdi32.dll")]
        static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth,
                                  int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);

        const uint SRCCOPY = 0x00CC0020;

        static IntPtr NIL = new IntPtr();

        static public Bitmap CaptureScreenRect(Rectangle rect)
        {
            Bitmap bit = new Bitmap(rect.Width, rect.Height);
            IntPtr ScreenDC = GetDC(NIL);
            try
            {
                ////////   Тут BitBlt возвращает false  ///////
                BitBlt(bit.GetHbitmap(), 0, 0, rect.Width, rect.Height, ScreenDC, rect.Left, rect.Top, SRCCOPY);
            }
            finally
            {
                ReleaseDC(NIL, ScreenDC);
            }
            return bit;
        }
    }

Автор: mr.DUDA 6.4.2006, 08:57
Во-первых, не IntPtr нужно юзать а HandleRef. Вот как BitBlt объявлена в System.Drawing.SafeNativeMethods:
Код
public static extern int BitBlt(HandleRef hDC, int x, int y, int nWidth, int nHeight, HandleRef hSrcDC, int xSrc, int ySrc, int dwRop);


Во-вторых, "bit.GetHbitmap()" не пойдёт. Это HBITMAP, а нужен HDC. Создаём Graphics из нашего битмапа, и берём GetHdc().

Это будет уже ближе к результату.

Автор: Ch0bits 6.4.2006, 16:09
О Великий учитель хакеров! Спасибо!

Теперь всё гораздо проще.
Код

        private void MakeShot_Click(object sender, EventArgs e)
        {
            int Width = Screen.PrimaryScreen.Bounds.Width;
            int Height = Screen.PrimaryScreen.Bounds.Height;

            Bitmap bit = new Bitmap(Width, Height);
            Graphics gr = Graphics.FromImage(bit);
            gr.CopyFromScreen(0, 0, 0, 0, new Size(Width, Height));

            bit.Save("shot.bmp");
        }

Автор: mr.DUDA 6.4.2006, 17:25
Действительно, проще.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)