A Windows függvény felhasználásához készítünk egy Win32 nevű osztályt. Ebben külsőként deklarálunk néhány függvényt, melyek majd a további munkánkhoz szükségesek lesznek. A képernyő eléréshez kell majd a GetDC, ReleaseDC, mely a User32.dll-ben van, valamint a már említett BitBlt a másoláshoz, melyet a Gdi32.dll tartalmaz.
public class Win32
{
[DllImport("user32.dll")]
public static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("gdi32.dll")]
public static extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);
}
A másoláshoz szükségünk lesz egy képernyő azonosítóra, mellyel annak teljes területéhez hozzáférhetünk, valamint egy Graphics osztályra, ami a Form-ra történő rajzolásban segít.
private void timer1_Tick(object sender, System.EventArgs e)
{
...
A GetDC függvényt, ha nulla értékű paraméterrel hívjuk, akkor a képernyő eléréséhez szükséges grafikai azonosítót kapjuk vissza, melyet tárolunk a screen változóba.
IntPtr screen = Win32.GetDC(IntPtr.Zero);
Ezt követően létrehozunk egy Graphics osztályt, melyet a Form azonosítójából származtatunk.
Graphics g = Graphics.FromHwnd(Handle);
Majd ennek is lekérjük a grafikai azonosítóját és tároljuk a form változóba.
IntPtr form = g.GetHdc();
Ezek után már hívhatjuk a BitBlt függvényt, mely elvégzi a másolást. Első paraméterként a célterület grafikai azonosítóját kell megadnunk. Ez nyilván a Form lesz. A következő két paraméter a Form-on belül a bal felső sarkot jelöli ki, ahová a kép másolását végezni szeretnénk. 0, 0 érték esetén a kép a Form bal felső sarkába kerül.
Ezt követő két paraméterben a másolandó kép szélességét, magasságát adhatjuk meg, mely most egyezni fog a Form aktuális méretével.
A hatodik paraméterben a forrás terület, vagyis a képernyő grafikai azonosítója kerül megadásra, majd ezt követi a forrás terület x, y koordinátája, vagyis, hogy a képernyő melyik pontjától kezdve történjen a másolás.
Végül a SRCCOPY konstans gondoskodik az elvégezendő műveletről, mely most az egyszerű másolás lesz.
Win32.BitBlt(form, 0, 0, ClientSize.Width, ClientSize.Height, screen, x, 0, Win32.SRCCOPY);
A másolás végeztével fel kell szabadítanunk a lefoglalt erőforrásokat.
g.ReleaseHdc(form);
Win32.ReleaseDC(IntPtr.Zero, screen);
}