WebHU - Programozási kérdések és válaszok

Végezze el a webböngésző vezérlésének képernyőképét a szálban

pontban bemutatott technikát használom

A webböngésző vezérlése új szálban

Megpróbáltam lekérni egy weboldal képernyőjét, és sikerült elérni, hogy a következő kód sikeresen működjön, amikor a WebBrowser vezérlőt egy WinForm-ra helyezzük. Ez azonban meghiúsul, mivel tetszőleges képet ad az asztalról, amikor egy szálon belül fut.

Thread browserThread = new Thread(() =>
{
    WebBrowser br = new WebBrowser();
    br.DocumentCompleted += webBrowser1_DocumentCompleted;
    br.ProgressChanged += webBrowser1_ProgressChanged;
    br.ScriptErrorsSuppressed = true;
    br.Navigate(url);
    Application.Run();
});
browserThread.SetApartmentState(ApartmentState.STA);
browserThread.Start();

private Image TakeSnapShot(WebBrowser browser)
{
    int width;
    int height;

    width = browser.ClientRectangle.Width;
    height = browser.ClientRectangle.Height;

    Bitmap image = new Bitmap(width, height);

    using (Graphics graphics = Graphics.FromImage(image))
    {
        Point p = new Point(0, 0);
        Point upperLeftSource = browser.PointToScreen(p);
        Point upperLeftDestination = new Point(0, 0);

        Size blockRegionSize = browser.ClientRectangle.Size;
        blockRegionSize.Width = blockRegionSize.Width - 15;
        blockRegionSize.Height = blockRegionSize.Height - 15;
        graphics.CopyFromScreen(upperLeftSource, upperLeftDestination, blockRegionSize);
    }

    return image;
}

Ez nyilvánvalóan a Graphics.CopyFromScreen() módszer miatt történik, de nem tudok más megközelítésről. Van valami módszer a probléma megoldására, amit valaki javasolhat? vagy az egyetlen lehetőségem, hogy létrehozok egy űrlapot, hozzáadom a vezérlőt, láthatóvá teszem, majd kihúzom a képernyőt? Nyilvánvaló okokból remélem, hogy elkerülöm ezt a megközelítést.


Válaszok:


1

Tudsz írni

private Image TakeSnapShot(WebBrowser browser)
{
     browser.Width = browser.Document.Body.ScrollRectangle.Width;
     browser.Height= browser.Document.Body.ScrollRectangle.Height;

     Bitmap bitmap = new Bitmap(browser.Width - System.Windows.Forms.SystemInformation.VerticalScrollBarWidth, browser.Height);

     browser.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));

     return bitmap;
}

Teljesen működő kód

var image = await WebUtils.GetPageAsImageAsync("http://www.stackoverflow.com");
image.Save(fname , System.Drawing.Imaging.ImageFormat.Bmp);

public class WebUtils
{
    public static Task<Image> GetPageAsImageAsync(string url)
    {
        var tcs = new TaskCompletionSource<Image>();

        var thread = new Thread(() =>
        {
            WebBrowser browser = new WebBrowser();
            browser.Size = new Size(1280, 768);

            WebBrowserDocumentCompletedEventHandler documentCompleted = null;
            documentCompleted = async (o, s) =>
            {
                browser.DocumentCompleted -= documentCompleted;
                await Task.Delay(2000); //Run JS a few seconds more

                Bitmap bitmap = TakeSnapshot(browser);

                tcs.TrySetResult(bitmap);
                browser.Dispose();
                Application.ExitThread();
            };

            browser.ScriptErrorsSuppressed = true;
            browser.DocumentCompleted += documentCompleted;
            browser.Navigate(url);
            Application.Run();
        });

        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();

        return tcs.Task;
    }

    private static Bitmap TakeSnapshot(WebBrowser browser)
    {
         browser.Width = browser.Document.Body.ScrollRectangle.Width;
         browser.Height= browser.Document.Body.ScrollRectangle.Height;

         Bitmap bitmap = new Bitmap(browser.Width - System.Windows.Forms.SystemInformation.VerticalScrollBarWidth, browser.Height);

         browser.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));

         return bitmap;
    }
}
07.09.2013
  • Pont olyan, amire szükségem volt. Valami olyasmit kerestem, mint a WebBrowser.DrawToBitmap(), de az intellisense-ben nem jelent meg (és még mindig nem), de jól lefordítja. Köszönöm! 08.09.2013
  • Köszönjük a System.Windows.Forms.SystemInformation megjelenítését is. Soha nem láttam még ilyet, és nyilvánvalóan nagyon hasznos. 08.09.2013
  • Kiváló. Pont olyan, amire szükségem volt. 15.12.2013
  • Kódminták using utasítások nélkül. sóhajt. 18.02.2016
  • @RobertHarvey köszönöm a VS-nek, ez könnyen megoldódik :) 24.02.2016
  • Persze, ha van Resharper. De még Resharper sem tud mindig olvasni a gondolataidban. 24.02.2016

  • 2
    using (Graphics graphics = Graphics.FromImage(image))
        {
            Point p = new Point(0, 0);
            Point upperLeftSource = browser.PointToScreen(p);
            Point upperLeftDestination = new Point(0, 0);
    
            Size blockRegionSize = browser.ClientRectangle.Size;
            blockRegionSize.Width = blockRegionSize.Width - 15;
            blockRegionSize.Height = blockRegionSize.Height - 15;
            graphics.CopyFromScreen(upperLeftSource, upperLeftDestination, blockRegionSize);
        }
    

    Valóban szüksége van használati utasításra?

    Ön is return image, de hogyan van hozzárendelve a másolt kép?

    07.09.2013
  • Igen, szüksége van egy használatára, kivéve, ha jó okunk van arra, hogy ne dobjon ki egy ID eldobható tárgyat. Ami a képet illeti, a Graphics graphics = Graphics.FromImage(image) soron keresztül van hozzárendelve. 08.09.2013
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..