[Mono-list] screen capturing in mono
Sebastien Pouliot
sebastien.pouliot at gmail.com
Wed Feb 28 15:47:27 EST 2007
Eric,
There's no alternative to p/invoke - even if you used 2.0 you would only
be calling a method hiding some platform specific p/invoke calls.
Now using 2.0 may not be an option for you, but that doesn't prevent you
from using CopyFromScreen. Why ? because it's open source :-)
Just create your own library using Mono source code for CopyFromScreen
(and the code it depends on) or include the source in your own project.
Sebastien
On Wed, 2007-02-28 at 13:27 -0700, Eric Morgan wrote:
> The problem isn't resizing - I don't have an original bitmap to
> resize. The problem is that I have a control that I want a screenshot
> of. So, I'm trying to create a Bitmap from whatever is appearing in
> the control.
>
> I pass the control in, then I call control.CreateGraphics();
> System.Drawing.Graphics g1 = c.CreateGraphics();
>
> Then, with the resulting graphics object, I try to create a new
> bitmap.
> Bitmap MyImage = new Bitmap(w, h, g1);
>
> The thing is, this bitmap is blank, unless I paste back in that BitBlt
> code. I can't figure out how to get a new bitmap from a graphics
> object, without BitBlt().
>
> Sebastien - Using 2.0 isn't an option, unfortunately.
>
> Is there any alternative from P/Invoking in this case?
>
> Thanks for all the help!
>
> Eric
>
> On 2/28/07, Abe Gillespie <abe.gillespie at gmail.com> wrote:
> It looks like you're just taking the image and resizing it to
> show in
> the dialog. You really should not have to go into native OS
> libraries
> to do so. Does this site help?
>
> http://www.peterprovost.org/archive/2003/05/29/516.aspx
>
> -Abe
>
> On 2/28/07, Eric Morgan <eric at rengeo.com> wrote:
> > I'm not too sure how to get a Bitmap object from a graphics
> object. From
> > all I've read, I just hear that you have to deal with device
> contexts. I'm
> > not too familiar with it, but BitBlt seems to be the way to
> do that. What
> > would I need to do to get that bitmap created with what
> appears in the
> > control using 100% .NET so it can run in mono? Here's a
> snippet of code.
> >
> >
> >
> [System.Runtime.InteropServices.DllImportAttribute("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
> > );
> >
> >
> > public static Bitmap PerformCapture(Control c, int
> maxWidth, int
> > maxHeight)
> > {
> > try
> > {
> > int w = c.ClientRectangle.Width;
> > int h = c.ClientRectangle.Height;
> >
> > w = System.Math.Min(w, maxWidth);
> > h = System.Math.Min(w, maxHeight);
> >
> > System.Drawing.Graphics g1 =
> > c.CreateGraphics();//this.CreateGraphics();
> > Bitmap MyImage = new Bitmap(w, h, g1);
> > System.Drawing.Graphics g2 =
> > System.Drawing.Graphics.FromImage (MyImage);
> > IntPtr dc1 = g1.GetHdc();
> > IntPtr dc2 = g2.GetHdc();
> > BitBlt(dc2, 0, 0, w, h, dc1, 0, 0,
> 13369376);
> > g1.ReleaseHdc(dc1);
> > g2.ReleaseHdc(dc2);
> >
> > //Separate dialog to display the image. If I comment out
> the BitBlt code,
> > it just appears blank.
> > Library.Windows.Dialogs.ScreenCaptureDlg
> > dlg = new
> > Library.Windows.Dialogs.ScreenCaptureDlg(MyImage);
> > dlg.ShowDialog();
> >
> > return MyImage;
> > }
> > catch(Exception error)
> > {
> > //our exception handling library.
> > Library.Common.ErrMsg.Err( error );
> > throw error;
> >
> > }
> > }
> >
> >
> >
> > On 2/28/07, Abe Gillespie <abe.gillespie at gmail.com> wrote:
> > > Are you P/Invoking for performance? Why not just use the
> GDI .Net API?
> > >
> > > -Abe
> > >
> > > On 2/28/07, Eric Morgan <eric at rengeo.com> wrote:
> > > > Hi all,
> > > >
> > > > Is there a good way to capture screens or something
> similar in mono? In
> > our
> > > > .NET application, we have custom controls, and we
> basically create a
> > > > graphics object from it, make a new bitmap, then do a
> bitblt to get it
> > into
> > > > the bitmap. This requires a P/Invoke into gdi32.dll ,
> which obviously
> > blows
> > > > up in mono. Is there a good way to do this using
> mono? Some other
> > library
> > > > maybe?
> > > >
> > > > I've tried installing wine and using the gdi32.dll.so
> that comes with
> > it,
> > > > but I don't know if I'm using it correctly or not. It
> can find the
> > library,
> > > > but it gives a SIGSEGV while trying to execute the
> bitblt operation.
> > Seemed
> > > > like kind of a hack, and I didn't really expect it to
> work... Do I need
> > > > other libraries along with the gdi32.dll.so ?
> > > >
> > > > Any advice is appreciated. Thanks.
> > > >
> > > > Eric Morgan
> > > > Renegade Geophysics
> > > > 303-661-0400, x2
> > > >
> > > > _______________________________________________
> > > > Mono-list maillist - Mono-list at lists.ximian.com
> > > > http://lists.ximian.com/mailman/listinfo/mono-list
> > > >
> > > >
> > >
> > >
> >
> >
> > _______________________________________________
> > Mono-list maillist - Mono-list at lists.ximian.com
> > http://lists.ximian.com/mailman/listinfo/mono-list
> >
> >
>
>
> _______________________________________________
> Mono-list maillist - Mono-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list
More information about the Mono-list
mailing list