Другие языки программирования и технологии

Как сделать скриншот рабочего стола C#

Проблема вот в чем: есть WinForm, в которой есть кнопочка скрина. Скриншот должен сделаться так, чтобы все, что находилось за формой. То есть вот так до нажатия тип форма и готовый скрин:
Заранее спасибо!
Yuriy L
Yuriy L
2 302
Набросал - работает.
На форму кидаем PictureBox. Называем его pictureBox, и кнопку ButtonTake
Связываем щелчок с ButtonTakeClick.

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;

namespace Screen
{
/// Description of MainForm.
public partial class MainForm : Form
{
[DllImport("gdi32.dll")]
private static extern IntPtr CreateDC(string strDriver, string strDevice, string strOutput, IntPtr pData);
[DllImport("gdi32.dll")]
private static extern bool DeleteDC(IntPtr hdc);
[DllImport("gdi32.dll")]
private static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32.dll")]
private static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
[DllImport("gdi32.dll")]
private static extern IntPtr CreateCompatibleBitmap (IntPtr hdc, int nWidth, int nHeight);
[DllImport("gdi32.dll")]
private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hObject);
[DllImport("gdi32.dll")]
private static extern bool BitBlt(IntPtr hDestDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);
private const int SRCCOPY = 0x0CC0020;
private const int HORZRES = 8;
private const int VERTRES = 10;

public MainForm()
{
InitializeComponent();
}

void ButtonTakeClick(object sender, EventArgs e)
{
IntPtr hdcScreen = CreateDC("DISPLAY", "", "", IntPtr.Zero);
IntPtr hdcCompatible = CreateCompatibleDC(hdcScreen);

int height = GetDeviceCaps(hdcScreen, VERTRES);
int width = GetDeviceCaps(hdcScreen, HORZRES);

IntPtr hbmScreen = CreateCompatibleBitmap(hdcScreen, width, height);

SelectObject(hdcCompatible, hbmScreen);

Hide();
Thread.Sleep(500); //На всякий, чтобы окна успели отрисоваться
BitBlt(hdcCompatible, 0, 0, width, height, hdcScreen, 0, 0, SRCCOPY);
Show();
pictureBox.Image = Bitmap.FromHbitmap(hbmScreen);
}
}
}

Screen - собственно этот пример, который сделал скрин среды и кода который был под формой =)
АЧ
Алексей Черетаев
84 764
Лучший ответ
Yuriy L Спасибо огромное!! Если не трудно, можешь мне на почту написать? У меня еще 1 вопросик. Большое спасибо. a.pchelkin@bk.ru
Алексей Черетаев Да там DeleteDC ещё лучше в конце сделать...
Сам импортировал, а чет поторопился немного.
Алексей Харин Вы наверное Windows/C++ программист ?
не понимаю про какую "форму" ты говоришь, но я знаю, как без всех программ сделать скриншот. prt sc если нажать эту кнопку, то делается скриншот и копируется в буфер обмена.
sysrq
Yuriy L Ребят, это тема программирования, вы ваще откуда?
Первым делом, мы должны зафиксировать снимок, как на фотоапарате. Ищем на вашей клавиатуре клавишу Print Screen или короче
говоря Prn Sc. У кого как. Кто не понял, смотрим
Erlan Aityshev
Erlan Aityshev
133
Yuriy L Ребят, это тема программирования, вы ваще откуда?