Toon posts:

[C#] Screenshot maken van bepaald gebied

Pagina: 1
Acties:

Onderwerpen


  • mdrop
  • Registratie: juni 2009
  • Laatst online: 27-08 11:34
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:



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

  • sig69
  • Registratie: mei 2002
  • Laatst online: 16:59
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.

  • Mastermind
  • Registratie: februari 2000
  • Laatst online: 06-07 13:07
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.

  • mdrop
  • Registratie: juni 2009
  • Laatst online: 27-08 11:34
Oke, op dit moment klinkt het allemaal wat 'onbekend', maar ga er vanavond maar is mee stoeien.

  • MM99
  • Registratie: april 2005
  • Laatst online: 17-09 11:59

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: 06-07 13:07
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 14:33

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

👌👀 good shit ✔💯

Zit er ook al sinds 2.0 in inderdaad :P

As always, we are nailed to a cross of our own construction.


  • Mastermind
  • Registratie: februari 2000
  • Laatst online: 06-07 13:07
:o

  • labee
  • Registratie: november 2002
  • Laatst online: 00:01
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


  • mdrop
  • Registratie: juni 2009
  • Laatst online: 27-08 11:34
Combinatie van bovenstaande code's doet wat het moet doen, mooi is de code niet geworden maar het werkt ;), dankje!
Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee