[Mono-list] screen capturing in mono

Abe Gillespie abe.gillespie at gmail.com
Wed Feb 28 14:57:14 EST 2007


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
>
>


More information about the Mono-list mailing list