Travolta25
Гость
|
|
« : 28-11-2008 11:18 » |
|
Добрый день. программирую на VC++.
подскажите код (или ссылку на код) снятия (в буфер или в память или куда там, чтоб доступ был к НBITMAP) скриншота заданной зоны рабочего стола экрана.
буду рад любой, даже косвенной информации. спасибо Вам
|
|
|
Записан
|
|
|
|
Ray
Интересующийся
Offline
|
|
« Ответ #1 : 09-01-2009 15:35 » |
|
Если еще актуально - могу выложить функцию. Писал несколько лет назад. Сдирает картинку с экрана.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #2 : 10-01-2009 08:29 » |
|
Ray, а выложи )
|
|
|
Записан
|
|
|
|
ObamaBarak
Гость
|
|
« Ответ #3 : 10-01-2009 20:32 » |
|
Для билдера - #include <Clipbrd.hpp> void __fastcall TForm1::Button1Click(TObject *Sender) { unsigned DataHandle; HPALETTE APalette; Word Format; Graphics::TBitmap *Bitmap=new Graphics::TBitmap; HDC DC=GetDC(0); try{ Bitmap->Height=Screen->Height; Bitmap->Width=Screen->Width; BitBlt( Bitmap->Canvas->Handle, 0, 0, Screen->Width, Screen->Height, DC, 0, 0, SRCCOPY); //Изображение экрана теперь в Bitmap, запишем его в бyфеp обмена Bitmap->SaveToClipboardFormat(Format,DataHandle,APalette); Clipboard()->SetAsHandle(Format,DataHandle); } __finally { delete Bitmap; ReleaseDC(0,DC); } }
|
|
« Последнее редактирование: 07-04-2009 08:07 от Вад »
|
Записан
|
|
|
|
Ray
Интересующийся
Offline
|
|
« Ответ #4 : 12-01-2009 06:47 » |
|
Для вижуала void CaptureScreen(HWND window) { //Получаем прямоугольную область экрана RECT windowRect; GetWindowRect(window, &windowRect);
//Размеры битмэпа int bitmap_dx = windowRect.right-windowRect.left; int bitmap_dy = windowRect.bottom-windowRect.top;
BITMAPINFOHEADER bmpInfoHeader; BITMAPFILEHEADER bmpFileHeader; BITMAP* pBitmap;
bmpFileHeader.bfType = 0x4d42; bmpFileHeader.bfSize = 0; bmpFileHeader.bfReserved1 = 0; bmpFileHeader.bfReserved2 = 0; bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmpInfoHeader.biSize = sizeof(bmpInfoHeader); bmpInfoHeader.biWidth = bitmap_dx; bmpInfoHeader.biHeight = bitmap_dy; bmpInfoHeader.biPlanes = 1; bmpInfoHeader.biBitCount = 24; bmpInfoHeader.biCompression = BI_RGB; bmpInfoHeader.biSizeImage = bitmap_dx*bitmap_dy*(24/8); bmpInfoHeader.biXPelsPerMeter = 0; bmpInfoHeader.biYPelsPerMeter = 0; bmpInfoHeader.biClrUsed = 0; bmpInfoHeader.biClrImportant = 0;
BITMAPINFO info; info.bmiHeader = bmpInfoHeader;
BYTE* memory; HDC winDC = GetWindowDC(window); HDC bmpDC = CreateCompatibleDC(winDC); //Создаем битмэп HBITMAP bitmap = CreateDIBSection(winDC, &info, DIB_RGB_COLORS, (void**)&memory, NULL, 0); SelectObject(bmpDC, bitmap);//Выбираем в контекст битмэп BitBlt(bmpDC, 0, 0, bitmap_dx, bitmap_dy, winDC, 0, 0, SRCCOPY); ReleaseDC(window, winDC);
OPENFILENAME ofn;//Указатель на структуру с данными инициализации диалогового окна char strFilter[] = "Файлы данных *.bmp\0"; char strFileName[MAX_PATH] = ""; memset(&ofn, 0, sizeof(OPENFILENAME));//Обнуление ofn ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = window; ofn.lpstrFilter = strFilter; ofn.lpstrFile = strFileName;//Буфер для имени файла ofn.nMaxFile = MAX_PATH;//Размер файла ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT; strcpy(strFileName, ofn.lpstrFile); GetSaveFileName(&ofn); //MessageBox(hwnd,"Невозможно сохранить файл","О программе...",MB_ICONINFORMATION); HANDLE hFile = CreateFile( ofn.lpstrFile, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) return; DWORD dwWritten = 0; WriteFile(hFile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); WriteFile(hFile, &bmpInfoHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL); WriteFile(hFile, memory, bmpInfoHeader.biSizeImage, &dwWritten, NULL); CloseHandle(hFile); }
|
|
« Последнее редактирование: 07-04-2009 08:04 от Вад »
|
Записан
|
|
|
|
Travolta25
Гость
|
|
« Ответ #5 : 06-04-2009 08:51 » |
|
Ray Лучше позже, но всё же лучше.
Спасибо за код.
|
|
|
Записан
|
|
|
|
Ray
Интересующийся
Offline
|
|
« Ответ #6 : 06-04-2009 08:59 » |
|
Travolta25Пожалуйста, надеюсь пригодится
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #7 : 06-04-2009 09:59 » |
|
В 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);
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #8 : 06-04-2009 11:15 » |
|
Serg79, это код для снимка всего экрана, а требуется только заданой части (или активного окна). Ну и код Ray больше (по количеству строк) ещё и потому, что он использовал ф-ю диалога выбора имени файла GetSaveFileName с иницаллизацией структуры и сохранение BMP файла, что потребовало инициализации загловка. Суть - использование ф-ции BitBlt.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Serg79
|
|
« Ответ #9 : 06-04-2009 13:51 » |
|
Ну если нужен скрин рабочего окна, то вместо "DISPLAY" в коде: hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); подставляем хендл своего окна. Простота приведенного кода из MSDN заключается в том, что совместимый BITMAP берется из контекста устройства а не делается вручную.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #10 : 06-04-2009 15:17 » |
|
Ну если нужен скрин рабочего окна, то вместо "DISPLAY" в коде: hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); подставляем хендл своего окна. Гхм... а сам-то пробовал? Простота приведенного кода из MSDN заключается в том, что совместимый BITMAP берется из контекста устройства а не делается вручную. Всё зависит от цели конечного использования. Ray подошёл практически - подготовил сразу всё для сохранения в файл, точно так же это можно использовать для записи в буфер обмена, как это делают многие скриншутеры. Поэтому с этой точки зрения код MSDN не проще, они ведь не показали как используют дальше HBITMAP да и инициаллизация объекта bmp тоже остаётся загадкой. А если нужны будут озвученые выше действия (сохранить, поместить в буфер), то ручками всё-равно придётся поработать. ps Я конечно код Ray не проверял на работоспособность, но считаю при соблюдении этого условия это хороший ответ на вопрос. Можно даже в ФАК поместить, что Лёшка ессно сделает, когда у него появится время.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 06-04-2009 15:38 » |
|
ну, пусть Ray проверяет )
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #12 : 06-04-2009 17:41 » |
|
Гхм... а сам-то пробовал? Джон, что бы Ты не сомневался, специально для тебя #include <windows.h> #include <stdlib.h> #include <stdio.h>
void ErrorMessage(char *str) { char buff[128];
sprintf(buff,"Failed %s",str); MessageBox(NULL,buff,"Error",MB_OK|MB_ICONSTOP); exit(1); }
PBITMAPINFO CreateBitmapInfoStruct(HBITMAP hBmp) { BITMAP bmp; PBITMAPINFO pbmi; WORD cClrBits;
// Retrieve the bitmap color format, width, and height. if (!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp)) ErrorMessage("GetObject");
// Convert the color format to a count of bits. cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel); if (cClrBits == 1) cClrBits = 1; else if (cClrBits <= 4) cClrBits = 4; else if (cClrBits <= 8) cClrBits = 8; else if (cClrBits <= 16) cClrBits = 16; else if (cClrBits <= 24) cClrBits = 24; else cClrBits = 32;
// Allocate memory for the BITMAPINFO structure. (This structure // contains a BITMAPINFOHEADER structure and an array of RGBQUAD // data structures.)
if (cClrBits != 24) pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1<< cClrBits));
// There is no RGBQUAD array for the 24-bit-per-pixel format.
else pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER));
// Initialize the fields in the BITMAPINFO structure.
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); pbmi->bmiHeader.biWidth = bmp.bmWidth; pbmi->bmiHeader.biHeight = bmp.bmHeight; pbmi->bmiHeader.biPlanes = bmp.bmPlanes; pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel; if (cClrBits < 24) pbmi->bmiHeader.biClrUsed = (1<<cClrBits);
// If the bitmap is not compressed, set the BI_RGB flag. pbmi->bmiHeader.biCompression = BI_RGB;
// Compute the number of bytes in the array of color // indices and store the result in biSizeImage. // For Windows NT, the width must be DWORD aligned unless // the bitmap is RLE compressed. This example shows this. // For Windows 95/98/Me, the width must be WORD aligned unless the // bitmap is RLE compressed. pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8 * pbmi->bmiHeader.biHeight; // Set biClrImportant to 0, indicating that all of the // device colors are important. pbmi->bmiHeader.biClrImportant = 0; return pbmi; }
void CreateBMPFile(LPTSTR pszFile, HBITMAP hBMP, HDC hDC) { PBITMAPINFO pbi; HANDLE hf; // file handle BITMAPFILEHEADER hdr; // bitmap file-header PBITMAPINFOHEADER pbih; // bitmap info-header LPBYTE lpBits; // memory pointer DWORD dwTotal; // total count of bytes DWORD cb; // incremental count of bytes BYTE *hp; // byte pointer DWORD dwTmp;
pbi = CreateBitmapInfoStruct(hBMP); pbih = (PBITMAPINFOHEADER) pbi; lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
if (!lpBits) ErrorMessage("GlobalAlloc");
// Retrieve the color table (RGBQUAD array) and the bits // (array of palette indices) from the DIB. if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi, DIB_RGB_COLORS)) { ErrorMessage("GetDIBits"); }
// Create the .BMP file. hf = CreateFile(pszFile, GENERIC_READ | GENERIC_WRITE, (DWORD) 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); if (hf == INVALID_HANDLE_VALUE) ErrorMessage("CreateFile"); hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" // Compute the size of the entire file. hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage); hdr.bfReserved1 = 0; hdr.bfReserved2 = 0;
// Compute the offset to the array of color indices. hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof (RGBQUAD);
// Copy the BITMAPFILEHEADER into the .BMP file. if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp, NULL)) { ErrorMessage("WriteFile"); }
// Copy the BITMAPINFOHEADER and RGBQUAD array into the file. if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof (RGBQUAD), (LPDWORD) &dwTmp, ( NULL)) ) ErrorMessage("WriteFile");
// Copy the array of color indices into the .BMP file. dwTotal = cb = pbih->biSizeImage; hp = lpBits; if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL)) ErrorMessage("WriteFile");
// Close the .BMP file. if (!CloseHandle(hf)) ErrorMessage("CloseHandle");
// Free memory. GlobalFree((HGLOBAL)lpBits); }
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { HDC hdcScreen, hdcCompatible; HBITMAP hbmScreen;
hdcScreen = CreateDC("DISPLAY",NULL,NULL,NULL); if (!hdcScreen) ErrorMessage("CreateDC"); hdcCompatible = CreateCompatibleDC(hdcScreen); if (!hdcCompatible) ErrorMessage("CreateCompatibleDC");
hbmScreen = CreateCompatibleBitmap(hdcScreen, GetDeviceCaps(hdcScreen, HORZRES), GetDeviceCaps(hdcScreen, VERTRES)); if (!hbmScreen) ErrorMessage("CreateCompatibleBitmap");
if (!SelectObject(hdcCompatible,hbmScreen)) ErrorMessage("SelectObject");
if (!BitBlt(hdcCompatible,0,0, GetDeviceCaps(hdcCompatible,HORZRES), GetDeviceCaps(hdcCompatible,VERTRES), hdcScreen,0,0,SRCCOPY)) ErrorMessage("BitBlt");
CreateBMPFile("screen.bmp",hbmScreen,hdcCompatible);
DeleteObject(hbmScreen); DeleteDC(hdcScreen); DeleteDC(hdcCompatible);
return 0; }
Создает скриншот экрана и помещает его в файл "screen.bmp". Как видно, скриншот создается в функции 'main'. Код для сохранения BMP файла взят из MSDN и немного подправлен для данного случая.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #13 : 06-04-2009 20:47 » |
|
Ну вобще-то, если специально для меня, то было бы неплохо показать именно использование "хэндла окна вместо " DISPLAY" в ф-ции CreateDC". Я именно это спрашивал. Поэтому сомнения всё ещё остались. Ну, а приведённый код "простоту" использования CreateCompatibleBitmap перед CreateDIBSection никак не доказывает. И кстати я не говорил, что так делать нельзя, хотя ни твой, ни код Ray я не тестировал.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Serg79
|
|
« Ответ #14 : 06-04-2009 21:24 » |
|
Ну, а приведённый код "простоту" использования CreateCompatibleBitmap перед CreateDIBSection никак не доказывает. И кстати я не говорил, что так делать нельзя, хотя ни твой, ни код Ray я не тестировал.
Так Ты скомпилируй и запусти приведенную программу, что бы не сомневаться. А если лень компилировать я прикрепил к этому посту готовый бинарник. А для копирования определенной области окна, кому нужно вставит соответствующие параметры копируемого RECT в функцию: if (!BitBlt(hdcCompatible,0,0, GetDeviceCaps(hdcCompatible,HORZRES), GetDeviceCaps(hdcCompatible,VERTRES), hdcScreen,0,0,SRCCOPY)) ErrorMessage("BitBlt");
Для создания скриншота окна, окно с начало надо создать и что то нарисовать на нем, а как видно из приведенного кода, окно не создается. P.S. Заметь Джон, что мною показана законченная программа которая на выходе дает BMP файл содержащий скриншот рабочего стола
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #15 : 06-04-2009 23:10 » |
|
Да мне не лень, просто времени нет. А оговорчку сделал, чтобы в случае наличия некоей мелкой ошибочки типа орфографической или синтаксической никто не решился бы копипастить напрямую код. Хотя я вам доверяю и думаю, что код у обоих скорее рабочий. Но дело не в этом. Ты так и не показал преимущества "MSDN-ого" подхода. Это раз. Два - ты всё-таки уходишь от ответа на мой вопрос. Моё замечание относилось ТОЛЬКО к твоему высказыванию (в третий раз подчёркиваю!) из #9: использование хэндла окна вместо "DISPLAY" в ф-ции CreateDCНу если нужен скрин рабочего окна, то вместо "DISPLAY" в коде: hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); подставляем хендл своего окна. ИМЕННО ЭТО Я У ТЕБЯ СПРАШИВАЮ, ИБО УВЕРЕН ЧТО НЕЛЬЗЯ ПОДСТАВИТЬ ПРОСТО ТАК ХЭНДЛ В Ф-ЦИЮ, КОТОРАЯ В КАЧЕСТВЕ ПАРАМЕТРА ОЖИДАЕТ СТРОКУ!!! Поэтому и спросил, а пробовал ли ты это сам сделать и чем всё закончилось. Это уже прямым текстом.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Serg79
|
|
« Ответ #16 : 07-04-2009 04:53 » |
|
использование хэндла окна вместо "DISPLAY" в ф-ции CreateDCНу если нужен скрин рабочего окна, то вместо "DISPLAY" в коде: hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); подставляем хендл своего окна. ИМЕННО ЭТО Я У ТЕБЯ СПРАШИВАЮ, ИБО УВЕРЕН ЧТО НЕЛЬЗЯ ПОДСТАВИТЬ ПРОСТО ТАК ХЭНДЛ В Ф-ЦИЮ, КОТОРАЯ В КАЧЕСТВЕ ПАРАМЕТРА ОЖИДАЕТ СТРОКУ!!! Странный Вы человек, Джон. Если надо получить контекст окна, то используйте функцию: HDC GetDC( HWND hWnd // handle to window );
Она на входе принимает хендл окна, это то как раз то что Вам нужно. Я думаю не сложно сообразить, вместо какой функции следует вызывать данную, ИЛИ ВСЕ ТАКИ ГОТОВЫЙ ПРИМЕР ПОКАЗАТЬ?Да мне не лень, просто времени нет. А оговорчку сделал, чтобы в случае наличия некоей мелкой ошибочки типа орфографической или синтаксической никто не решился бы копипастить напрямую код. Хотя я вам доверяю и думаю, что код у обоих скорее рабочий.
Ну если нет времени, желания или возможности, то высказывания "мало ли, в случаи ли, типа мелкая ошибка, да и вообще копипаст может сломаться", лучше оставить для себя.
|
|
|
Записан
|
|
|
|
Ray
Интересующийся
Offline
|
|
« Ответ #17 : 07-04-2009 06:04 » |
|
Алексей1153++Хм.. что проверять-то? Код работает нормально Я его когда-то давно для одной своей программы делал.Все работает
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 07-04-2009 07:34 » |
|
Джон, Serg79, горячие финские парни А ну ка, по примеру рабочего кода в студию, и не спорить Ну а кто уже выложил рабочий код, можно уже не. Ray, никто не сомневался, что у тебя всё работает. Просто вот лично Джон не тестировал, лично я тоже, поэтому уточняем. Ведь если в ФАК выложить непроверенное решение, будет несерьёзно выглядеть
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #19 : 07-04-2009 07:53 » |
|
Странный Вы человек, Джон. Ну моя "странность" легко объясняется ВАШИМ ещё более странным прведением. Сначала ВЫ заявляеете, что дескать подставте хэндл вместо строки и делов-то, а когда ВАС просят подтвердить это глупое высказывание, ЗАМЕТЬТЕ - НЕ ПРЕДЛОЖИТЬ АЛЬТЕРНАТИВНЫЙ СПОСОБ, а обосновать ИМЕННО ЭТО ГЛУПОЕ ВЫСКАЗЫВАНИЕ, ВЫ приводите кучу букафф, пусть даже и рабочих, но совершенно не в тему и не отвечающих НА ЭТОТ ВОПРОС. Может просто задуматься и впредь, дабы не вводить в заблуждение программеров начинающих, сначала хорошенько подумать, а потом уже давать советы с видом крутого знатока дела? Ну если нет времени, желания или возможности, то высказывания "мало ли, в случаи ли, типа мелкая ошибка, да и вообще копипаст может сломаться", лучше оставить для себя.
По поводу, высказывания своего мнения относительно кода оставлю таки право за собой решать, что говорить а что нет. Ибо никто из вас не удосужился написать, что код рабочий, проверен, или взят из рабочего проекта. Вот и всё. Обычно, когда приводят ГОТОВЫЙ код, такие коменты добавляют. В случае же обрывка кода в #7 автор видимо не только забыл об этом упомянуть, но также забыл сказать, что именно проще. Чем его супер код лучше уже приведённого решения? Кстати до сих пор вразумительного ответа и на этот вопрос я так не услышал. Ну и какие претензии? Будем отвечать на поставленые вопросы или будем дальше про огурцы рассказывать?
|
|
« Последнее редактирование: 07-04-2009 07:57 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Serg79
|
|
« Ответ #20 : 07-04-2009 08:48 » |
|
Джон, ну что я могу Вам ответить, остается только развести руками и ретироваться, закостенелый снобизм ничем не пробьешь.
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #21 : 07-04-2009 09:12 » |
|
Мдя... И не лень вам холивары разводить. А если по теме,то скрин области рабочего стола в разных вариантах практически во всевозможных факах имеется. Вот если кто выложит код скрина, который умеет и видеопотоки скринить (к примеру на рабочем столе видео в медиаплеере проигрывается, или игрушка какая), вот это было бы интересно, а так... детский сад, имхо.
|
|
|
Записан
|
|
|
|
Travolta25
Гость
|
|
« Ответ #22 : 08-04-2009 11:16 » |
|
Код Ray-я, Я уже закинул в программу. Всё в шоколаде. Единственный понятный мне (нубу ессно) код скрина. В общем, хорошо что все пообщались, пришли к каким-то своим выводам. И пока тема горячая хочу узнать. Вот как мне, среднестатистическому нубу взять *.bmp из ресурса сравнить со скрином нужной зоны? То есть что нужно для этого? Массивы сравнить? как к ним подобраться? и как узнать сравнились они,не сравнились? или если мне нужно не абсолютное сходство, а только 80%.?
В общем вот так вот. Спасибо всем по-любому.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #23 : 08-04-2009 13:12 » |
|
Travolta25, если не абсолютное сходство, то нужна свертка - это из области цифровой обработки сигналов.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Axenic
Гость
|
|
« Ответ #24 : 08-02-2010 17:06 » |
|
Третий день пытаюсь найти работающий код который бы делал скрин экрана. У меня такой код, он делает скрин рабочего стола.... должен делать.... Но вместо этого в обьекте pictureBox1 картинка заменяется на пустую и ничего не происходит, подскажите как правильно. HDC scrdc, memdc; HBITMAP membit; scrdc = GetDC(0); memdc = CreateCompatibleDC(scrdc); membit = CreateCompatibleBitmap(scrdc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); SelectObject(memdc, membit); BitBlt(memdc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), scrdc, 0, 0, SRCCOPY); Bitmap^ bmp=gcnew Bitmap(GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)); IntPtr ukaz(membit); bmp->FromHbitmap(ukaz); bmp->Save("D:\\kkk.bmp"); this->pictureBox1->Image = bmp;
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #25 : 08-02-2010 19:06 » |
|
а если так scrdc = ::GetWindowDC(::GetDesktopWindow())
|
|
|
Записан
|
|
|
|
Axenic
Гость
|
|
« Ответ #26 : 09-02-2010 05:37 » |
|
Все равно пустое изображение
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #27 : 09-02-2010 06:09 » |
|
ня HDC scrdc, memdc; HBITMAP membit;
//scrdc = GetDC(0); scrdc = ::GetWindowDC(::GetDesktopWindow());
memdc = CreateCompatibleDC(scrdc);
int xx=GetSystemMetrics(SM_CXSCREEN); int yy=GetSystemMetrics(SM_CYSCREEN);
membit = CreateCompatibleBitmap(scrdc, xx, yy);
HBITMAP oldBMP=(HBITMAP)SelectObject(memdc, membit);
BitBlt(memdc, 0, 0, xx, yy, scrdc, 0, 0, SRCCOPY);
//Bitmap^ bmp=gcnew Bitmap(xx,yy);
//чистить!!! SelectObject(memdc, oldBMP); DeleteObject(membit); DeleteObject(memdc); DeleteObject(scrdc);
|
|
|
Записан
|
|
|
|
Axenic
Гость
|
|
« Ответ #28 : 09-02-2010 16:37 » |
|
Я так понял, что у тебя все изображение заносится в oldBMP. А теперь как его вывести в файл например? Или присвоить свойству Image обьекта PictureBox? Я делаю так: HDC scrdc, memdc; HBITMAP membit; scrdc = ::GetWindowDC(::GetDesktopWindow()); memdc = CreateCompatibleDC(scrdc); int xx=GetSystemMetrics(SM_CXSCREEN); int yy=GetSystemMetrics(SM_CYSCREEN); membit = CreateCompatibleBitmap(scrdc, xx, yy); HBITMAP oldBMP=(HBITMAP)SelectObject(memdc, membit); BitBlt(memdc, 0, 0, xx, yy, scrdc, 0, 0, SRCCOPY); SelectObject(memdc, oldBMP); Bitmap^ bmp=gcnew Bitmap(xx,yy); IntPtr ukaz(oldBMP); bmp->FromHbitmap(ukaz); bmp->Save("D:\\kkk.bmp"); Но как и прежде ничего в файл не выводится. П.С. Если поможешь мне с этой проблемой отблагодарю ста рублями на телефон Уж слишком долго мучаюсь
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #29 : 09-02-2010 16:50 » |
|
Я с дотнетом не дружу Я чисто АПИ показал. Я у себя в MFC-шном проекте вывел из вышеупомянутого битмапа на экран, чем убедился, что скрин - в битмапе. А дальше - к дотнетчикам. В качестве предположения: не создавать АПИшный объект битмапа вручную, а взять у объекта Bitmap методом Bitmap.GetHbitmap и там сразу и рисовать (прибиндить его к контексту)
|
|
|
Записан
|
|
|
|
|