[C#] Screenshot maken van bepaald gebied

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mdrop
  • Registratie: Juni 2009
  • Niet online
Tweakers,

Ben al een tijdje bezig om middels een klein script (Achter een button) screenshots af te vangen van een interne media player (AxWindowsMediaPlayer, met de naam 'speler'). Hij maakt screenshots ook met de juiste grote maar op de een of andere manier niet van de speler zelf maar van andere plek in het scherm, ik gebruik de volgende code;

code:
1
2
3
4
5
6
7
8
9
            Rectangle bounds = speler.Bounds;
            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
                }
                bitmap.Save("C://still-" + DateTime.Now.Hour.ToString() + "-" + DateTime.Now.Minute.ToString() + "-" + DateTime.Now.Second.ToString() + ".jpg", ImageFormat.Jpeg);
            }


En ipv dat ik nu een screenshot krijg van de speler krijg ik dit:

Afbeeldingslocatie: http://www.dumpyourphoto.com/files2/45383/PUVK6.png

Iemand enig idee hoe ik het voor elkaar krijg dat hij wel het screenshot trekt van de speler (Mag met de buttons).

Alvast bedankt,
Mdrop

Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:24
Je kan natuurlijk niet de bounds van de "speler" zomaar gebruiken voor je hele scherm. De bounds van je speler zijn relatief ten opzichte van het form waar hij op zit. Je zal iets van Form.PointToScreen moeten gebruiken denk ik.

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 00:17
Hij pakt inderdaad de desktop. Ik heb zelf interopservices gebruikt om een control uit te printen.
voeg bovenin toe:
C#:
1
using System.Runtime.InteropServices;


Roep unmanaged code aan met een method:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  [DllImport("gdi32.dll")] private static extern bool BitBlt(
            IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, System.Int32 dwRop );

        private const Int32 SRCCOPY = 0xCC0020;
        private Bitmap memImage;

        private void PrepareImage(Control c)
        {
            Graphics graphic = c.CreateGraphics();
            Size s = c.Size;
            memImage = new Bitmap(s.Width, s.Height, graphic);
            Graphics memGraphic = Graphics.FromImage(memImage);
            IntPtr dc1 = graphic.GetHdc();
            IntPtr dc2 = memGraphic.GetHdc();
            BitBlt(dc2, 0, 0, c.ClientRectangle.Width, c.ClientRectangle.Height, dc1, 0, 0, SRCCOPY);
            graphic.ReleaseHdc(dc1);
            memGraphic.ReleaseHdc(dc2);
        }


Als je PrepareImage met als parameter het controlobject van die speler aanroept staat de screenshot van die control in de global variabele memImage als een BitMap in het geheugen.
Deze Image kun je dan verder in je code gebruiken.

Acties:
  • 0 Henk 'm!

  • mdrop
  • Registratie: Juni 2009
  • Niet online
Oke, op dit moment klinkt het allemaal wat 'onbekend', maar ga er vanavond maar is mee stoeien.

Acties:
  • 0 Henk 'm!

  • MM99
  • Registratie: April 2005
  • Laatst online: 20-05 23:16

MM99

That is the way I am!

Mastermind schreef op dinsdag 16 november 2010 @ 11:13:
Hij pakt inderdaad de desktop. Ik heb zelf interopservices gebruikt om een control uit te printen.
voeg bovenin toe:
C#:
1
using System.Runtime.InteropServices;


Roep unmanaged code aan met een method:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  [DllImport("gdi32.dll")] private static extern bool BitBlt(
            IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, System.Int32 dwRop );

        private const Int32 SRCCOPY = 0xCC0020;
        private Bitmap memImage;

        private void PrepareImage(Control c)
        {
            Graphics graphic = c.CreateGraphics();
            Size s = c.Size;
            memImage = new Bitmap(s.Width, s.Height, graphic);
            Graphics memGraphic = Graphics.FromImage(memImage);
            IntPtr dc1 = graphic.GetHdc();
            IntPtr dc2 = memGraphic.GetHdc();
            BitBlt(dc2, 0, 0, c.ClientRectangle.Width, c.ClientRectangle.Height, dc1, 0, 0, SRCCOPY);
            graphic.ReleaseHdc(dc1);
            memGraphic.ReleaseHdc(dc2);
        }


Als je PrepareImage met als parameter het controlobject van die speler aanroept staat de screenshot van die control in de global variabele memImage als een BitMap in het geheugen.
Deze Image kun je dan verder in je code gebruiken.
Dat is een mooie stukje code. Vraag me alleen af of er niet iets in de .Net framework standaard zit.

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 00:17
Ik heb het toen eens in het .NET 2.0 framework gezocht, maar ik kon echter geen class/method vinden die precies doet wat dit doet (keihard het scherm uitlezen). Daarom de gdi32.dll methods maar gebruiken.

Is het je al trouwens al gelukt, mdrop?

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

C#:
1
2
3
4
5
6
7
public void CopyFromScreen(
    int sourceX,
    int sourceY,
    int destinationX,
    int destinationY,
    Size blockRegionSize
)

http://msdn.microsoft.com/en-us/library/fw1kt6f9.aspx
Dit helpt je misschien al verder. Hoef je in ieder geval de Interop achterwege te laten.

Nu met Land Rover Series 3 en Defender 90


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Zit er ook al sinds 2.0 in inderdaad :P

https://oneerlijkewoz.nl
Het ergste moet nog komen / Het leven is een straf / Een uitgestrekte kwelling van de wieg tot aan het graf


Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 00:17
:o

Acties:
  • 0 Henk 'm!

  • labee
  • Registratie: November 2002
  • Laatst online: 10-09-2022
code:
1
2
Bitmap bmp = new Bitmap(speler.Width, speler.Height);
speler.DrawToBitmap(bmp, new Rectangle(0, 0, speler.Width, speler.Height));

[ Voor 6% gewijzigd door labee op 19-11-2010 15:37 ]

http://www.labee.nl


Acties:
  • 0 Henk 'm!

  • mdrop
  • Registratie: Juni 2009
  • Niet online
Combinatie van bovenstaande code's doet wat het moet doen, mooi is de code niet geworden maar het werkt ;), dankje!
Pagina: 1