Screenshot erstellen
-
Hallo Forenmitgleider
Ich komme mal gleich zur sache:#include <windows.h> #include <string> #include <iostream> using namespace std; class CStellwerk { private: HWND m_hDesktop; public: void MakeScreenshot(char SavePath[]); void SaveScreen(HWND pScreen, char Path[]); }; void CStellwerk::MakeScreenshot(char SavePath[]) { m_hDesktop = GetDesktopWindow(); if(m_hDesktop == NULL) { exit(1); } SaveScreen(m_hDesktop,SavePath); } int main() { CStellwerk Stellwerk; Stellwerk.MakeScreenshot("C:\\screen.bmp"); } void CStellwerk::SaveScreen(HWND pScreen, char Path[]) { int nWidth = GetSystemMetrics(SM_CXSCREEN); int nHeight = GetSystemMetrics(SM_CYSCREEN); HWND hWnd = ::GetDesktopWindow(); HDC hdc = ::GetDC(hWnd); HDC memDC = ::CreateCompatibleDC(hdc); HBITMAP hbm = ::CreateCompatibleBitmap(hdc, nWidth, nHeight); HBITMAP hbmOld = (HBITMAP)::SelectObject(memDC, hbm); ::BitBlt(memDC, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY); BITMAPINFO bmi; ZeroMemory(&bmi, sizeof(bmi)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = nWidth; bmi.bmiHeader.biHeight = nHeight; bmi.bmiHeader.biBitCount = 24; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biBitCount * nWidth * nHeight / 8; BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage]; ::GetDIBits( memDC, hbm, 0, bmi.bmiHeader.biHeight, pbBits, &bmi, DIB_RGB_COLORS ); BITMAPFILEHEADER bfh; bfh.bfType = ('M' << 8) + 'B'; bfh.bfSize = sizeof(BITMAPFILEHEADER) + bmi.bmiHeader.biSizeImage + sizeof(BITMAPINFOHEADER); bfh.bfReserved1 = 0; bfh.bfReserved2 = 0; bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); // // Hier: // HANDLE hfile = CreateFile( _T("c:\\screen.bmp"), // UM DIESE ZEILE GEHT ES! GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0 ); DWORD dwWritten; WriteFile(hfile,&bfh, sizeof(bfh), &dwWritten, NULL); WriteFile(hfile,&bmi.bmiHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL); WriteFile(hfile,pbBits, bmi.bmiHeader.biSizeImage, &dwWritten, NULL); CloseHandle(hfile); ::SelectObject(memDC, hbmOld); ::DeleteDC(memDC); ::ReleaseDC(hWnd,hdc); ::DeleteObject(hbm); delete[] pbBits; }
Ergibt beim C::B folgende Fehler bei mir:
main.cpp: In member function
void CStellwerk::SaveScreen(HWND__*, char*)': main.cpp:81: error:
_T' was not declared in this scope
main.cpp:81: warning: unused variable '_T'
Process terminated with status 1 (0 minutes, 0 seconds)
1 errors, 1 warnings
-
Nimm statt _T einfach TEXT(), das funktionier häufiger.
Oder gib am anfang der datei #define _T TEXT an.
-
Also jetzt rastet der Compiler richtig.
Das doofe bei solchen Fehlern ist, dass ich nichtmal erahnen kann was los ist.Linking console executable: bin\Debug\screeny.exe
obj\Debug\main.o: In functionZN10CStellwerk10SaveScreenEP6HWND(char *)': main.cpp:45: undefined reference to
CreateCompatibleDC@4'
main.cpp:46: undefined reference toCreateCompatibleBitmap@12' main.cpp:47: undefined reference to
SelectObject@8'
main.cpp:49: undefined reference toBitBlt@36' main.cpp:65: undefined reference to
GetDIBits@28'
main.cpp:99: undefined reference toSelectObject@8' main.cpp:100: undefined reference to
DeleteDC@4'
main.cpp:102: undefined reference to `DeleteObject@4'
collect2: ld returned 1 exit status
-
Bibliothek Gdi32.lib inkludieren !
-
Das wars, danke