GDI+ problem

P

Pohihihi

I am getting a generic GDI+ error on following code. Basically it is trying
to capture screen image and save in a file.
Is there a way to find more details on this error? Thanks for the help.

---------------------------
ERROR MSG
---------------------------
System.Runtime.InteropServices.ExternalException: A generic error occurred
in GDI+.
at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder,
EncoderParameters encoderParams)
at System.Drawing.Image.Save(String filename, ImageFormat format)
at ScreenCapture.Form1.TakeSnapNow() in c:\visual studio
projects\screencapture\form1.cs:line 102



Sorry for the formating below.

//First, you need to import the BitBlt, GetDC and ReleaseDC functions.

//imports the GDI BitBlt function that enables the background of the window

//to be captured

[DllImport("gdi32.dll")]

private static extern bool BitBlt(

IntPtr hdcDest, // handle to destination DC

int nXDest, // x-coord of destination upper-left corner

int nYDest, // y-coord of destination upper-left corner

int nWidth, // width of destination rectangle

int nHeight, // height of destination rectangle

IntPtr hdcSrc, // handle to source DC

int nXSrc, // x-coordinate of source upper-left corner

int nYSrc, // y-coordinate of source upper-left corner

System.Int32 dwRop // raster operation code

);


[DllImport("User32.dll")]

public extern static System.IntPtr GetDC(System.IntPtr hWnd);

[DllImport("User32.dll")]

public extern static int ReleaseDC(System.IntPtr hWnd, System.IntPtr hDC);
//modified to include hWnd


//Now, to capture the screen in it's entirety you can do the following.

public void TakeSnapNow()

{

System.IntPtr desktopDC=GetDC(System.IntPtr.Zero);

Bitmap bm=new Bitmap(SystemInformation.VirtualScreen.Width,
SystemInformation.VirtualScreen.Height);

try

{

Graphics g=Graphics.FromImage(bm);

System.IntPtr bmDC=g.GetHdc();

BitBlt(bmDC,0,0,bm.Width,bm.Height,desktopDC,0,0,0x00CC0020 /*SRCCOPY*/);

bm.Save("C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);

ReleaseDC(System.IntPtr.Zero, desktopDC);

g.ReleaseHdc(bmDC);

g.Dispose();

}

catch(Exception er)

{

MessageBox.Show(er.ToString());

}

}
 
G

Guest

Pohihihi said:
I am getting a generic GDI+ error on following code. Basically it is trying
to capture screen image and save in a file.
Is there a way to find more details on this error? Thanks for the help.

---------------------------
ERROR MSG
---------------------------
System.Runtime.InteropServices.ExternalException: A generic error occurred
in GDI+.
at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder,
EncoderParameters encoderParams)
at System.Drawing.Image.Save(String filename, ImageFormat format)
at ScreenCapture.Form1.TakeSnapNow() in c:\visual studio
projects\screencapture\form1.cs:line 102



Sorry for the formating below.

//First, you need to import the BitBlt, GetDC and ReleaseDC functions.

//imports the GDI BitBlt function that enables the background of the window

//to be captured

[DllImport("gdi32.dll")]

private static extern bool BitBlt(

IntPtr hdcDest, // handle to destination DC

int nXDest, // x-coord of destination upper-left corner

int nYDest, // y-coord of destination upper-left corner

int nWidth, // width of destination rectangle

int nHeight, // height of destination rectangle

IntPtr hdcSrc, // handle to source DC

int nXSrc, // x-coordinate of source upper-left corner

int nYSrc, // y-coordinate of source upper-left corner

System.Int32 dwRop // raster operation code

);


[DllImport("User32.dll")]

public extern static System.IntPtr GetDC(System.IntPtr hWnd);

[DllImport("User32.dll")]

public extern static int ReleaseDC(System.IntPtr hWnd, System.IntPtr hDC);
//modified to include hWnd


//Now, to capture the screen in it's entirety you can do the following.

public void TakeSnapNow()

{

System.IntPtr desktopDC=GetDC(System.IntPtr.Zero);

Bitmap bm=new Bitmap(SystemInformation.VirtualScreen.Width,
SystemInformation.VirtualScreen.Height);

try

{

Graphics g=Graphics.FromImage(bm);

System.IntPtr bmDC=g.GetHdc();

BitBlt(bmDC,0,0,bm.Width,bm.Height,desktopDC,0,0,0x00CC0020 /*SRCCOPY*/);

bm.Save("C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);

ReleaseDC(System.IntPtr.Zero, desktopDC);

g.ReleaseHdc(bmDC);

g.Dispose();

}

catch(Exception er)

{

MessageBox.Show(er.ToString());

}

}
 
G

Guest

Hi Pohihihi,
on the line:

bm.Save("C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);

I believe that having a single \ will cause problems because \<char> is
regarded as an escape character.

Try:
bm.Save(@"C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);
which the @ means use the literal value of the string ignoring escape
characters

or
bm.Save("C:\\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);


Hope that helps.
Mark
 
P

Pohihihi

Thanks Mark that was the real cause. I was looking all around to find the
problem.
I am still interested in learning how to trap errors while using interops.


Mark R. Dawson said:
Hi Pohihihi,
on the line:

bm.Save("C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);

I believe that having a single \ will cause problems because \<char> is
regarded as an escape character.

Try:
bm.Save(@"C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);
which the @ means use the literal value of the string ignoring escape
characters

or
bm.Save("C:\\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);


Hope that helps.
Mark

Pohihihi said:
I am getting a generic GDI+ error on following code. Basically it is
trying
to capture screen image and save in a file.
Is there a way to find more details on this error? Thanks for the help.

---------------------------
ERROR MSG
---------------------------
System.Runtime.InteropServices.ExternalException: A generic error
occurred
in GDI+.
at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder,
EncoderParameters encoderParams)
at System.Drawing.Image.Save(String filename, ImageFormat format)
at ScreenCapture.Form1.TakeSnapNow() in c:\visual studio
projects\screencapture\form1.cs:line 102



Sorry for the formating below.

//First, you need to import the BitBlt, GetDC and ReleaseDC functions.

//imports the GDI BitBlt function that enables the background of the
window

//to be captured

[DllImport("gdi32.dll")]

private static extern bool BitBlt(

IntPtr hdcDest, // handle to destination DC

int nXDest, // x-coord of destination upper-left corner

int nYDest, // y-coord of destination upper-left corner

int nWidth, // width of destination rectangle

int nHeight, // height of destination rectangle

IntPtr hdcSrc, // handle to source DC

int nXSrc, // x-coordinate of source upper-left corner

int nYSrc, // y-coordinate of source upper-left corner

System.Int32 dwRop // raster operation code

);


[DllImport("User32.dll")]

public extern static System.IntPtr GetDC(System.IntPtr hWnd);

[DllImport("User32.dll")]

public extern static int ReleaseDC(System.IntPtr hWnd, System.IntPtr
hDC);
//modified to include hWnd


//Now, to capture the screen in it's entirety you can do the following.

public void TakeSnapNow()

{

System.IntPtr desktopDC=GetDC(System.IntPtr.Zero);

Bitmap bm=new Bitmap(SystemInformation.VirtualScreen.Width,
SystemInformation.VirtualScreen.Height);

try

{

Graphics g=Graphics.FromImage(bm);

System.IntPtr bmDC=g.GetHdc();

BitBlt(bmDC,0,0,bm.Width,bm.Height,desktopDC,0,0,0x00CC0020 /*SRCCOPY*/);

bm.Save("C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);

ReleaseDC(System.IntPtr.Zero, desktopDC);

g.ReleaseHdc(bmDC);

g.Dispose();

}

catch(Exception er)

{

MessageBox.Show(er.ToString());

}

}
 
G

Guest

For looking what the exact error was through the interop services you can get
the last error from the Win32 calls, although you cannot call the
GetLastError method directly, you must go through a method called
GetLastWin32Error.

Basically make sure you have imported the namespace
System.Runtime.InteropServices then when you import a DLL you need to set the
SetLastError property to true i.e.

[DllImport("gdi32.dll", SetLastError=true)]

Then when you have an exception you can do:

intError = Marshal.GetLastWin32Error();

which returns the error code.

I am not an expert in this, but this might be enough to get you pointed in
the right direction.

Hope that helps
Mark.

Pohihihi said:
Thanks Mark that was the real cause. I was looking all around to find the
problem.
I am still interested in learning how to trap errors while using interops.


Mark R. Dawson said:
Hi Pohihihi,
on the line:

bm.Save("C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);

I believe that having a single \ will cause problems because \<char> is
regarded as an escape character.

Try:
bm.Save(@"C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);
which the @ means use the literal value of the string ignoring escape
characters

or
bm.Save("C:\\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);


Hope that helps.
Mark

Pohihihi said:
I am getting a generic GDI+ error on following code. Basically it is
trying
to capture screen image and save in a file.
Is there a way to find more details on this error? Thanks for the help.

---------------------------
ERROR MSG
---------------------------
System.Runtime.InteropServices.ExternalException: A generic error
occurred
in GDI+.
at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder,
EncoderParameters encoderParams)
at System.Drawing.Image.Save(String filename, ImageFormat format)
at ScreenCapture.Form1.TakeSnapNow() in c:\visual studio
projects\screencapture\form1.cs:line 102



Sorry for the formating below.

//First, you need to import the BitBlt, GetDC and ReleaseDC functions.

//imports the GDI BitBlt function that enables the background of the
window

//to be captured

[DllImport("gdi32.dll")]

private static extern bool BitBlt(

IntPtr hdcDest, // handle to destination DC

int nXDest, // x-coord of destination upper-left corner

int nYDest, // y-coord of destination upper-left corner

int nWidth, // width of destination rectangle

int nHeight, // height of destination rectangle

IntPtr hdcSrc, // handle to source DC

int nXSrc, // x-coordinate of source upper-left corner

int nYSrc, // y-coordinate of source upper-left corner

System.Int32 dwRop // raster operation code

);


[DllImport("User32.dll")]

public extern static System.IntPtr GetDC(System.IntPtr hWnd);

[DllImport("User32.dll")]

public extern static int ReleaseDC(System.IntPtr hWnd, System.IntPtr
hDC);
//modified to include hWnd


//Now, to capture the screen in it's entirety you can do the following.

public void TakeSnapNow()

{

System.IntPtr desktopDC=GetDC(System.IntPtr.Zero);

Bitmap bm=new Bitmap(SystemInformation.VirtualScreen.Width,
SystemInformation.VirtualScreen.Height);

try

{

Graphics g=Graphics.FromImage(bm);

System.IntPtr bmDC=g.GetHdc();

BitBlt(bmDC,0,0,bm.Width,bm.Height,desktopDC,0,0,0x00CC0020 /*SRCCOPY*/);

bm.Save("C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);

ReleaseDC(System.IntPtr.Zero, desktopDC);

g.ReleaseHdc(bmDC);

g.Dispose();

}

catch(Exception er)

{

MessageBox.Show(er.ToString());

}

}
 
P

Pohihihi

Thanks Mark, it is a nice start for me, I will dig more in interops on MSDN.


Mark R. Dawson said:
For looking what the exact error was through the interop services you can
get
the last error from the Win32 calls, although you cannot call the
GetLastError method directly, you must go through a method called
GetLastWin32Error.

Basically make sure you have imported the namespace
System.Runtime.InteropServices then when you import a DLL you need to set
the
SetLastError property to true i.e.

[DllImport("gdi32.dll", SetLastError=true)]

Then when you have an exception you can do:

intError = Marshal.GetLastWin32Error();

which returns the error code.

I am not an expert in this, but this might be enough to get you pointed in
the right direction.

Hope that helps
Mark.

Pohihihi said:
Thanks Mark that was the real cause. I was looking all around to find the
problem.
I am still interested in learning how to trap errors while using
interops.


Mark R. Dawson said:
Hi Pohihihi,
on the line:

bm.Save("C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);

I believe that having a single \ will cause problems because \<char> is
regarded as an escape character.

Try:
bm.Save(@"C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);
which the @ means use the literal value of the string ignoring escape
characters

or
bm.Save("C:\\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);


Hope that helps.
Mark

:

I am getting a generic GDI+ error on following code. Basically it is
trying
to capture screen image and save in a file.
Is there a way to find more details on this error? Thanks for the
help.

---------------------------
ERROR MSG
---------------------------
System.Runtime.InteropServices.ExternalException: A generic error
occurred
in GDI+.
at System.Drawing.Image.Save(String filename, ImageCodecInfo
encoder,
EncoderParameters encoderParams)
at System.Drawing.Image.Save(String filename, ImageFormat format)
at ScreenCapture.Form1.TakeSnapNow() in c:\visual studio
projects\screencapture\form1.cs:line 102



Sorry for the formating below.

//First, you need to import the BitBlt, GetDC and ReleaseDC functions.

//imports the GDI BitBlt function that enables the background of the
window

//to be captured

[DllImport("gdi32.dll")]

private static extern bool BitBlt(

IntPtr hdcDest, // handle to destination DC

int nXDest, // x-coord of destination upper-left corner

int nYDest, // y-coord of destination upper-left corner

int nWidth, // width of destination rectangle

int nHeight, // height of destination rectangle

IntPtr hdcSrc, // handle to source DC

int nXSrc, // x-coordinate of source upper-left corner

int nYSrc, // y-coordinate of source upper-left corner

System.Int32 dwRop // raster operation code

);


[DllImport("User32.dll")]

public extern static System.IntPtr GetDC(System.IntPtr hWnd);

[DllImport("User32.dll")]

public extern static int ReleaseDC(System.IntPtr hWnd, System.IntPtr
hDC);
//modified to include hWnd


//Now, to capture the screen in it's entirety you can do the
following.

public void TakeSnapNow()

{

System.IntPtr desktopDC=GetDC(System.IntPtr.Zero);

Bitmap bm=new Bitmap(SystemInformation.VirtualScreen.Width,
SystemInformation.VirtualScreen.Height);

try

{

Graphics g=Graphics.FromImage(bm);

System.IntPtr bmDC=g.GetHdc();

BitBlt(bmDC,0,0,bm.Width,bm.Height,desktopDC,0,0,0x00CC0020
/*SRCCOPY*/);

bm.Save("C:\file.bmp",System.Drawing.Imaging.ImageFormat.Bmp);

ReleaseDC(System.IntPtr.Zero, desktopDC);

g.ReleaseHdc(bmDC);

g.Dispose();

}

catch(Exception er)

{

MessageBox.Show(er.ToString());

}

}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top