[Mono-list] screen capturing in mono

Abe Gillespie abe.gillespie at gmail.com
Wed Feb 28 15:56:04 EST 2007


Well there's obviously some way to draw the control ... otherwise it
wouldn't show up normally.  Heh.  :)

Perhaps just dig into the Mono code, find how the control renders
itself, and expose that through the DrawToBitmap method.  You
certainly wouldn't have to implement this for every known control ...
just the specific one you're using.  Implementing more, of course,
wouldn't cause anyone to complain.

Of course that is .Net 2.0 as Sebastien points out and you've stated
that isn't an option.

-Abe

On 2/28/07, Sebastien Pouliot <sebastien.pouliot at gmail.com> wrote:
> On Wed, 2007-02-28 at 15:34 -0500, Abe Gillespie wrote:
> > Have you tried the DrawToBitmap method?
>
> Nice one, but 2.0 and not yet implemented in Mono.
>
> > -Abe
> >
> > On 2/28/07, Eric Morgan <eric at rengeo.com> 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
> > >
> > >
> > _______________________________________________
> > 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