CGI Script gibt falsche werte zurück
Peter
- sonstiges
Hallo,
ich bin gerade dabei, ein cgi script mit c zu schreiben, welches mir einen Screenshot vom Desktop erzeugen soll. Solange ich die Befehlzeile benutze, gibt mir GetDeviceCaps() die richtigen Werte zurück (1440x900). Lasse ich den Code jedoch über apache 2.2 laufen, gibt mir GetDeviceCaps immer wieder eine Auflösung von 1024x768 zurück.
Woran liegt das und wie berichtige ich das? Hoffe ihr könnt mir helfen....
Hi,
ich bin gerade dabei, ein cgi script mit c zu schreiben, welches mir einen Screenshot vom Desktop erzeugen soll. Solange ich die Befehlzeile benutze, gibt mir GetDeviceCaps() die richtigen Werte zurück (1440x900). Lasse ich den Code jedoch über apache 2.2 laufen, gibt mir GetDeviceCaps immer wieder eine Auflösung von 1024x768 zurück.
Laufen beide Sachen denn auf dem selben (ggf. virtuellen) Desktop ab ...?
MfG ChrisB
Hi,
ich bin gerade dabei, ein cgi script mit c zu schreiben, welches mir einen Screenshot vom Desktop erzeugen soll. Solange ich die Befehlzeile benutze, gibt mir GetDeviceCaps() die richtigen Werte zurück (1440x900). Lasse ich den Code jedoch über apache 2.2 laufen, gibt mir GetDeviceCaps immer wieder eine Auflösung von 1024x768 zurück.
Laufen beide Sachen denn auf dem selben (ggf. virtuellen) Desktop ab ...?
MfG ChrisB
Jupp tun sie, nur dass ichs statt direkt aus dem IE oder Opera starten will... wenns hilft der Quellcode:
void takesshot()
{
HWND hWnd = GetDesktopWindow();
HDC hdc = GetDC(hWnd);
HDC memDC = CreateCompatibleDC(hdc);
HBITMAP hbm = CreateCompatibleBitmap(hdc, GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES));
HBITMAP hbmOld = (HBITMAP)SelectObject(memDC, hbm);
printf("<BR>Resolution: %dx%dx%d", GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES), GetDeviceCaps(hdc, BITSPIXEL));
BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = GetDeviceCaps(hdc, HORZRES);
bmi.bmiHeader.biHeight = GetDeviceCaps(hdc, VERTRES);
bmi.bmiHeader.biBitCount = GetDeviceCaps(hdc, BITSPIXEL);
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biBitCount * GetDeviceCaps(hdc, HORZRES) * GetDeviceCaps(hdc, VERTRES) / 8;
byte *pbBits = malloc(bmi.bmiHeader.biSizeImage);
BitBlt(memDC, 0, 0, GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES), hdc, 0, 0, SRCCOPY);
if(GetDIBits( memDC,
hbm,
0,
bmi.bmiHeader.biHeight,
pbBits,
&bmi,
DIB_RGB_COLORS ))
printf("<BR>GetDIBits successfully....");
else
printf("<BR>GetDIBits failed....");
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);
HANDLE hfile = CreateFile( "screen.bmp",
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);
}