Снимок окна оп его Handle
Добавлено: 05 Сентябрь 2010, 17:41
Приветствую сообщество!
Возникал тема получить BMP из текущего окна (Handle понятно дело известен) путем собственного кода без всяких ImageEx . Изучен пример Grabber - если окно свернуто или на него положено другое то не получить его BMP корректно.
За основу пример из Delphi.
____________-
hSrcWnd := FindWindow(nil, PChAR('Test')); // "*********" - имя нужного окна
GetWindowRect(hSrcWnd, rcSrc);
Это опускаем так как эти параметры известны
hSrcWnd - хэндл окна
hDC1:= GetDC(hSrcWnd);
hSrcDC:=CreateCompatibleDC(hDC1);
hBmp := CreateCompatibleBitmap(hDC1, rcSrc.right - rcSrc.left, rcSrc.bottom - rcSrc.top);
SelectObject(hSrcDC, hBmp);
PrintWindow(hSrcWnd, hSrcDC, 0);
BitBlt(
hDC1,
0,
0,
rcSrc.right - rcSrc.left,
rcSrc.bottom - rcSrc.top,
hSrcDC,
0,
0,
SRCCOPY);
Здесь сохранение в файл
DeleteObject(hBmp);
DeleteDC(hSrcDC);
ReleaseDC(hSrcWnd, hDC1);
___________
У нас это примерно так с учетом примера Grabber
hDC1 = GetDC(hSrcWnd)
hdcCompatible = CreateCompatibleDC(hDC1)
hbmScreen = CreateCompatibleBitmap(hDC1,Rec.Right,Rec.Bottom)
IF NOT hbmScreen
RETURN 1
END
IF NOT SelectObject(hdcCompatible, hbmScreen)
RETURN 1
END
PrintWindow(hSrcWnd, hdcCompatible, 0)
IF NOT BitBlt(hDC1,0,0,Rec.Right,Rec.Bottom,hdcCompatible,Rec.Left,Rec.Top,SRCCOPY)
RETURN 1
END
Далее все освобождаем!
Собственно вопрос:
Проблема в объявлении PrintWindow никак не линкуется (в user32.dll точно есть такая функция )
PrintWindow(HWND, HDC, DWORD),BOOL,PASCAL,PROC или прототип не верен?
Возникал тема получить BMP из текущего окна (Handle понятно дело известен) путем собственного кода без всяких ImageEx . Изучен пример Grabber - если окно свернуто или на него положено другое то не получить его BMP корректно.
За основу пример из Delphi.
____________-
hSrcWnd := FindWindow(nil, PChAR('Test')); // "*********" - имя нужного окна
GetWindowRect(hSrcWnd, rcSrc);
Это опускаем так как эти параметры известны
hSrcWnd - хэндл окна
hDC1:= GetDC(hSrcWnd);
hSrcDC:=CreateCompatibleDC(hDC1);
hBmp := CreateCompatibleBitmap(hDC1, rcSrc.right - rcSrc.left, rcSrc.bottom - rcSrc.top);
SelectObject(hSrcDC, hBmp);
PrintWindow(hSrcWnd, hSrcDC, 0);
BitBlt(
hDC1,
0,
0,
rcSrc.right - rcSrc.left,
rcSrc.bottom - rcSrc.top,
hSrcDC,
0,
0,
SRCCOPY);
Здесь сохранение в файл
DeleteObject(hBmp);
DeleteDC(hSrcDC);
ReleaseDC(hSrcWnd, hDC1);
___________
У нас это примерно так с учетом примера Grabber
hDC1 = GetDC(hSrcWnd)
hdcCompatible = CreateCompatibleDC(hDC1)
hbmScreen = CreateCompatibleBitmap(hDC1,Rec.Right,Rec.Bottom)
IF NOT hbmScreen
RETURN 1
END
IF NOT SelectObject(hdcCompatible, hbmScreen)
RETURN 1
END
PrintWindow(hSrcWnd, hdcCompatible, 0)
IF NOT BitBlt(hDC1,0,0,Rec.Right,Rec.Bottom,hdcCompatible,Rec.Left,Rec.Top,SRCCOPY)
RETURN 1
END
Далее все освобождаем!
Собственно вопрос:
Проблема в объявлении PrintWindow никак не линкуется (в user32.dll точно есть такая функция )
PrintWindow(HWND, HDC, DWORD),BOOL,PASCAL,PROC или прототип не верен?