Я думаю, что работа с Memory DC решит вашу проблему. Для этого сначала импортируйте:
[DllImport("gdi32.dll", EntryPoint = "CreateCompatibleDC")]
public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32.dll", EntryPoint = "SelectObject")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
[DllImport("gdi32.dll",EntryPoint="DeleteDC")]
public static extern IntPtr DeleteDC(IntPtr hDc);
И вместо этого:
IntPtr bitmaphdc = GetDC(bmap);
BitBlt(bitmaphdc, 0, 0, System.Convert.ToInt32(this.Width), System.Convert.ToInt32(this.Height), windowhdc, 0, 0, TernaryRasterOperations.SRCCOPY);
Сделайте это:
IntPtr memdc = CreateCompatibleDC(windowhdc);
SelectObject(memdc, bmap);
BitBlt(memdc, 0, 0, System.Convert.ToInt32(this.Width), System.Convert.ToInt32(this.Height), windowhdc, 0, 0, TernaryRasterOperations.SRCCOPY);
Не забудьте удалить Memort DC позже:
DeleteDC(memdc);
И кстати, вам не нужно image1.BeginInit();
.
Также, чтобы проверить, вам не нужно перечислять все окна. Вместо этого используйте GetDesktopWindow
метод из user32.dll.