Подскажите, как можно программно получить снимок экрана эквивалентный тому, который получается при нажатии клавиши Print Screen. Попробывал делать через GetDesktopWindow. Но обнаружил следующее: некоторые окна програм написанных под .NET не снимаются (отсутствуют в снимке экрана), а если делать через Print Screen они отображены на скриншоте. Какие есть еще способы получить снимок экрана, чтобы захвачено было все?
Здравствуйте, creatman, Вы писали:
C>Подскажите, как можно программно получить снимок экрана эквивалентный тому, который получается при нажатии клавиши Print Screen. Попробывал делать через GetDesktopWindow. Но обнаружил следующее: некоторые окна програм написанных под .NET не снимаются (отсутствуют в снимке экрана), а если делать через Print Screen они отображены на скриншоте. Какие есть еще способы получить снимок экрана, чтобы захвачено было все?
Вот хороший кусочек кода (из MSDN'а):
// Create a normal DC and a memory DC for the entire screen. The
// normal DC provides a "snapshot" of the screen contents. The
// memory DC keeps a copy of this "snapshot" in the associated
// bitmap.
hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL);
hdcCompatible = CreateCompatibleDC(hdcScreen);
// Create a compatible bitmap for hdcScreen.
hbmScreen = CreateCompatibleBitmap(hdcScreen,
GetDeviceCaps(hdcScreen, HORZRES),
GetDeviceCaps(hdcScreen, VERTRES));
if (hbmScreen == 0)
errhandler("hbmScreen", hwnd);
// Select the bitmaps into the compatible DC. if (!SelectObject(hdcCompatible, hbmScreen))
errhandler("Compatible Bitmap Selection", hwnd);
// Hide the application window.
ShowWindow(hwnd, SW_HIDE);
//Copy color data for the entire display into a
//bitmap that is selected into a compatible DC. if (!BitBlt(hdcCompatible,
0,0,
bmp.bmWidth, bmp.bmHeight,
hdcScreen,
0,0,
SRCCOPY))
errhandler("Screen to Compat Blt Failed", hwnd);
// Redraw the application window.
ShowWindow(hwnd, SW_SHOW);
C>>Подскажите, как можно программно получить снимок экрана эквивалентный тому, который получается при нажатии клавиши Print Screen. Попробывал делать через GetDesktopWindow. Но обнаружил следующее: некоторые окна програм написанных под .NET не снимаются (отсутствуют в снимке экрана), а если делать через Print Screen они отображены на скриншоте. Какие есть еще способы получить снимок экрана, чтобы захвачено было все?
_>Вот хороший кусочек кода (из MSDN'а):
[skipped]
Указанный код не снимет лайеред окна (это решается соотв. флагом в bitblt). Ну и оверлей... (а это уже не решается)
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>И получаем по шее от пользователя за порчу Clipboard.
Не смеши мои ботинки :D Про буфер обмена, в условии, нет ни слова. Если уж так нужно сохранить его "девственность", то можно сделать это самому. В чем проблемы то?
Здравствуйте, Andrew S, Вы писали:
C>>>Подскажите, как можно программно получить снимок экрана эквивалентный тому, который получается при нажатии клавиши Print Screen. Попробывал делать через GetDesktopWindow. Но обнаружил следующее: некоторые окна програм написанных под .NET не снимаются (отсутствуют в снимке экрана), а если делать через Print Screen они отображены на скриншоте. Какие есть еще способы получить снимок экрана, чтобы захвачено было все?
_>>Вот хороший кусочек кода (из MSDN'а):
AS>[skipped]
AS>Указанный код не снимет лайеред окна (это решается соотв. флагом в bitblt). Ну и оверлей... (а это уже не решается)
Здравствуйте, creatman, Вы писали:
C>Подскажите, как можно программно получить снимок экрана эквивалентный тому, который получается при нажатии клавиши Print Screen. Попробывал делать через GetDesktopWindow. Но обнаружил следующее: некоторые окна програм написанных под .NET не снимаются (отсутствуют в снимке экрана), а если делать через Print Screen они отображены на скриншоте. Какие есть еще способы получить снимок экрана, чтобы захвачено было все?
Я делаю так:
#include "atlimage.h" //использую для вызова newImage.Save(A2W(buf)); // чтобы сохранить полученую картинку в jpg формате.
HDC DC,newDC;
HBITMAP hBmp;
CImage newImage;
DC = GetDC(NULL); //взять контекст устройств дисплея
newDC = CreateCompatibleDC(DC); // создать ему совместимый контекст устройства
int xD= GetSystemMetrics(SM_CXSCREEN); размары экрана
int yD = GetSystemMetrics(SM_CYSCREEN);размары экрана
hBmp = CreateCompatibleBitmap(DC,xD,yD); создания совместимого с контекстом устройства битмапа
SelectObject(newDC,hBmp);
if (!BitBlt(newDC,0,0,xD,yD,DC,0,0,SRCCOPY|CAPTUREBLT)) ATLTRACE("\nErrror!!\n"); CAPTUREBLT для отображеняи layred окон
Здравствуйте, AndNot, Вы писали:
AN>Не смеши мои ботинки :D Про буфер обмена, в условии, нет ни слова. Если уж так нужно сохранить его "девственность", то можно сделать это самому. В чем проблемы то?
Код собс-ручного сохранения невинности — в студию.