IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Jak vytvořit a uložit screenshot formu (formuláře)

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Kubas129
Člen
Avatar
Kubas129:8.11.2020 0:17

Neporadil by mi ještě někdo prosím s tímto? Snažím přinutit aplikaci, aby mi udělala screen formuláře a následně ho uložila, problém ale je jak používám tu knihovnu na vykreslení grafu, tak že ten graf není nějak kompatibilní s Bitmapou a hází mi to error a vůbec nevím co s tím :(
Děkuji za všechny rady

private void udelejScreenShot()
{
    Bitmap bitmap = new Bitmap(this.Width, this.Height);
    DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
    bitmap.Save("@Screen", ImageFormat.Jpeg);
}

Zkusil jsem: Google
a převést ten formát na Bitmapu (neúspěšně)

Chci docílit: Screen shotu formuláře

 
Odpovědět
8.11.2020 0:17
Avatar
JerryM
Člen
Avatar
JerryM:8.11.2020 15:03
  1. screenshot formu lze udělat JEN tehdy pokud je CELY zobrazený na obrazovce jinak to nejde
  2. náodů je netu hafo stačí zadat do googlu správné heslo

https://www.google.cz/search?…

 
Nahoru Odpovědět
8.11.2020 15:03
Avatar
Kubas129
Člen
Avatar
Odpovídá na JerryM
Kubas129:8.11.2020 15:31

Ano, ale všechny jsou přes bitmapu \)nebo alespon ty, které jsem našel)

 
Nahoru Odpovědět
8.11.2020 15:31
Avatar
HONZ4
Člen
Avatar
Odpovídá na Kubas129
HONZ4:8.11.2020 19:33

Chybu to vypisuje jasně.Musíš to tam dát celé:
System.Drawin­g.Imaging.Ima­geFormat.Jpeg
jinak ti to bere ImageFormat z prostoru OxyPlot

Editováno 8.11.2020 19:34
 
Nahoru Odpovědět
8.11.2020 19:33
Avatar
Kubas129
Člen
Avatar
Odpovídá na HONZ4
Kubas129:8.11.2020 19:39

aha díky to jsem nevěděl, nicméně mi to nesnímá ten graf, jak to?

 
Nahoru Odpovědět
8.11.2020 19:39
Avatar
HONZ4
Člen
Avatar
Odpovídá na Kubas129
HONZ4:8.11.2020 19:47

OxyPlot neznám, nemusí být podporován. Hledat se mě to nechce.

 
Nahoru Odpovědět
8.11.2020 19:47
Avatar
Kubas129
Člen
Avatar
Odpovídá na HONZ4
Kubas129:8.11.2020 21:12

To je právě ono, ona ta knihovna nepodporuje bitmapu, proto by mě spíše jen zajímal obyčejný print screen, který třeba snadno udělám ve window zkratkou alt+print

 
Nahoru Odpovědět
8.11.2020 21:12
Avatar
HONZ4
Člen
Avatar
Odpovídá na Kubas129
HONZ4:9.11.2020 16:50

Dolaď si to:

using System;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WINGDISAMPLE
{
    public partial class Form1: Form
    {
        string screenshotfileneme;
        public Form1()
        {
            InitializeComponent();

            screenshotfileneme = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "appscreenshot.png");
        }



        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                using(Bitmap bmp = SafeNativeMethods.CaptureWindow(this.Handle))
                {
                    using(FileStream fs = new FileStream(screenshotfileneme, FileMode.Create, FileAccess.Write))
                    {
                        bmp.Save(fs, System.Drawing.Imaging.ImageFormat.Png);
                    }
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }

    internal static class SafeNativeMethods
    {
        [DllImport("gdi32.dll")]
        static extern bool BitBlt(IntPtr hdcDest, int nxDest, int nyDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);

        [DllImport("gdi32.dll")]
        static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int width, int nHeight);

        [DllImport("gdi32.dll")]
        static extern IntPtr CreateCompatibleDC(IntPtr hdc);

        [DllImport("gdi32.dll")]
        static extern IntPtr DeleteDC(IntPtr hdc);

        [DllImport("gdi32.dll")]
        static extern IntPtr DeleteObject(IntPtr hObject);

        [DllImport("user32.dll")]
        static extern IntPtr GetDesktopWindow();

        [DllImport("user32.dll")]
        static extern IntPtr GetWindowDC(IntPtr hWnd);

        [DllImport("user32.dll")]
        static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc);

        [DllImport("gdi32.dll")]
        static extern IntPtr SelectObject(IntPtr hdc, IntPtr hObject);

        const int SRCCOPY = 0x00CC0020;

        const int CAPTUREBLT = 0x40000000;

        //
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }
        //

        static Bitmap CaptureRegion(Rectangle region)
        {
            IntPtr desktophWnd;
            IntPtr desktopDc;
            IntPtr memoryDc;
            IntPtr bitmap;
            IntPtr oldBitmap;
            bool success;
            Bitmap result;

            desktophWnd = GetDesktopWindow();
            desktopDc = GetWindowDC(desktophWnd);
            memoryDc = CreateCompatibleDC(desktopDc);
            bitmap = CreateCompatibleBitmap(desktopDc, region.Width, region.Height);
            oldBitmap = SelectObject(memoryDc, bitmap);

            success = BitBlt(memoryDc, 0, 0, region.Width, region.Height, desktopDc, region.Left, region.Top, SRCCOPY | CAPTUREBLT);

            try
            {
                if(!success)
                {
                    throw new Win32Exception();
                }

                result = Image.FromHbitmap(bitmap);
            }
            finally
            {
                SelectObject(memoryDc, oldBitmap);
                DeleteObject(bitmap);
                DeleteDC(memoryDc);
                ReleaseDC(desktophWnd, desktopDc);
            }

            return result;
        }

        public static Bitmap CaptureWindow(IntPtr hWnd)
        {
            RECT region;
            GetWindowRect(hWnd, out region);
            return CaptureRegion(Rectangle.FromLTRB(region.left, region.top, region.right, region.bottom));
        }
    }
}
 
Nahoru Odpovědět
9.11.2020 16:50
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.