BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
return (int)DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINBOX), NULL, DlgProc);
}
HDC g_hDcBitmap;
HBITMAP g_hBm;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
RECT rect = {0};
HDC hDc;
if (!IsWindowVisible(hwnd)) return TRUE;
hDc = GetWindowDC(hwnd);
GetWindowRect(hwnd, &rect);
BitBlt(g_hDcBitmap, rect.left, rect.top, rect.right, rect.bottom, hDc, 0, 0, SRCCOPY);
ReleaseDC(hwnd, hDc);
return TRUE;
}
DWORD WINAPI ThreadSavingScreen(LPVOID lpParam)
{
HWND hWnd = (HWND)lpParam;
long lAspect = 0;
HDC hDc;
RECT rect = {0};
ShowWindow(hWnd, SW_HIDE);
while (IsWindowVisible(hWnd))
_asm nop;
if (!g_hDcBitmap)
{
hDc = GetDC(NULL);
g_hDcBitmap = CreateCompatibleDC(hDc);
g_hBm = CreateCompatibleBitmap(hDc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
SelectObject(g_hDcBitmap, g_hBm);
ReleaseDC(NULL, hDc);
}
else
{
SelectObject(g_hDcBitmap, GetStockObject(NULL_PEN));
Rectangle(g_hDcBitmap, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
}
EnumWindows(EnumWindowsProc, FALSE);
//save image to the file
HANDLE hFile = CreateFile("screenshot.bmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
BITMAPFILEHEADER bfh = {0};
BITMAPINFOHEADER bih = {0};
BITMAP bm = {0};
DWORD dwToWrite = 0;
DWORD dwSizeBuffer = 1;
LPBYTE lpBuff = NULL;
GetObject(g_hBm, sizeof(bm), (LPVOID)&bm);
bih.biSize = sizeof(bih);
bih.biWidth = bm.bmWidth;
bih.biHeight = bm.bmHeight;
bih.biBitCount = bm.bmBitsPixel;
bih.biPlanes = 1;
dwSizeBuffer = bm.bmWidth * bm.bmHeight * bm.bmBitsPixel / 8;
bfh.bfSize = sizeof(bfh) + sizeof(bih) + dwSizeBuffer;
bfh.bfOffBits = sizeof(bfh) + sizeof(bih);
bfh.bfType = 0x4d42;
lpBuff = new BYTE[dwSizeBuffer];
ZeroMemory((LPVOID)lpBuff, dwSizeBuffer);
GetDIBits(g_hDcBitmap, g_hBm, 0, bm.bmHeight, (LPVOID)lpBuff, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);
WriteFile(hFile, &bfh, sizeof(bfh), &dwToWrite, NULL);
WriteFile(hFile, &bih, sizeof(bih), &dwToWrite, NULL);
WriteFile(hFile, lpBuff, dwSizeBuffer, &dwToWrite, NULL);
delete []lpBuff;
CloseHandle(hFile);
}
InvalidateRect(hWnd, NULL, TRUE);
ShowWindow(hWnd, SW_SHOW);
return 0;
}
BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hDc;
switch (message)
{
case WM_PAINT:
hDc = BeginPaint(hWnd, &ps);
if (g_hDcBitmap)
{
SetMapMode(hDc, MM_ANISOTROPIC);
SetViewportExtEx(hDc, ps.rcPaint.right, ps.rcPaint.bottom, NULL);
SetWindowExtEx(hDc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL);
BitBlt(hDc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), g_hDcBitmap, 0, 0, SRCCOPY);
}
EndPaint(hWnd, &ps);
return TRUE;
case WM_COMMAND:
if (wParam == IDC_PTRSCR)
{
CreateThread(NULL, 0, ThreadSavingScreen, (LPVOID)hWnd, 0, NULL);
}
return TRUE;
case WM_CLOSE:
if (g_hDcBitmap)
{
DeleteDC(g_hDcBitmap);
DeleteObject(g_hBm);
}
EndDialog(hWnd, 0);
return TRUE;
default:
return FALSE;
}
}
Screenshot!
Проблема заключается в следующем: курсор мышки не захватывается(эту беду я решил - отрисовываю его ручками), и содержимое окна обычного медиаплеера тоже не захватывается. Mediaplayer, как и многие другие проигрыватели выводит изображение через оверлеи, КАК ИХ ЗАХВАТИТЬ?...
Если не ошибаюсь, то для захвата видео нужно ДиректХ юзать.
перечисляй все окна в системы и копируй контекст видимых в с свой контест
Zushenskiy, с медиаплеером, да и вообще со всеми плеерами такой фокус не пройдет. Будет черный экран.
Цитата:
Zushenskiy, с медиаплеером, да и вообще со всеми плеерами такой фокус не пройдет. Будет черный экран.
Могу тебя огорчить как не странно получиться. или может ты хочешь сказать оболочка медиаплеера это не окно(а)?
у любого окна можно получить его контест и копировать его в другой крнтекст
это так к размышлению :D
Цитата: Zushenskiy
Могу тебя огорчить как не странно получиться. или может ты хочешь сказать оболочка медиаплеера это не окно(а)?
у любого окна можно получить его контест и копировать его в другой крнтекст
это так к размышлению :D
у любого окна можно получить его контест и копировать его в другой крнтекст
это так к размышлению :D
Mediaplayer пользуется оверлеями. Это так, к размышлению...
да, он использует оверлеи. :о) но мне-то от этого нелегче! господа, может кто-нибдуь знает как получить доступ к первичной поверхности? в DX я дуб, да и ради одно прожки разбираться времени нет... Есть тут DX гуру? ;о)
Цитата: Zushenskiy
Код:
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
return (int)DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINBOX), NULL, DlgProc);
}
HDC g_hDcBitmap;
HBITMAP g_hBm;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
RECT rect = {0};
HDC hDc;
if (!IsWindowVisible(hwnd)) return TRUE;
hDc = GetWindowDC(hwnd);
GetWindowRect(hwnd, &rect);
BitBlt(g_hDcBitmap, rect.left, rect.top, rect.right, rect.bottom, hDc, 0, 0, SRCCOPY);
ReleaseDC(hwnd, hDc);
return TRUE;
}
DWORD WINAPI ThreadSavingScreen(LPVOID lpParam)
{
HWND hWnd = (HWND)lpParam;
long lAspect = 0;
HDC hDc;
RECT rect = {0};
ShowWindow(hWnd, SW_HIDE);
while (IsWindowVisible(hWnd))
_asm nop;
if (!g_hDcBitmap)
{
hDc = GetDC(NULL);
g_hDcBitmap = CreateCompatibleDC(hDc);
g_hBm = CreateCompatibleBitmap(hDc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
SelectObject(g_hDcBitmap, g_hBm);
ReleaseDC(NULL, hDc);
}
else
{
SelectObject(g_hDcBitmap, GetStockObject(NULL_PEN));
Rectangle(g_hDcBitmap, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
}
EnumWindows(EnumWindowsProc, FALSE);
//save image to the file
HANDLE hFile = CreateFile("screenshot.bmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
BITMAPFILEHEADER bfh = {0};
BITMAPINFOHEADER bih = {0};
BITMAP bm = {0};
DWORD dwToWrite = 0;
DWORD dwSizeBuffer = 1;
LPBYTE lpBuff = NULL;
GetObject(g_hBm, sizeof(bm), (LPVOID)&bm);
bih.biSize = sizeof(bih);
bih.biWidth = bm.bmWidth;
bih.biHeight = bm.bmHeight;
bih.biBitCount = bm.bmBitsPixel;
bih.biPlanes = 1;
dwSizeBuffer = bm.bmWidth * bm.bmHeight * bm.bmBitsPixel / 8;
bfh.bfSize = sizeof(bfh) + sizeof(bih) + dwSizeBuffer;
bfh.bfOffBits = sizeof(bfh) + sizeof(bih);
bfh.bfType = 0x4d42;
lpBuff = new BYTE[dwSizeBuffer];
ZeroMemory((LPVOID)lpBuff, dwSizeBuffer);
GetDIBits(g_hDcBitmap, g_hBm, 0, bm.bmHeight, (LPVOID)lpBuff, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);
WriteFile(hFile, &bfh, sizeof(bfh), &dwToWrite, NULL);
WriteFile(hFile, &bih, sizeof(bih), &dwToWrite, NULL);
WriteFile(hFile, lpBuff, dwSizeBuffer, &dwToWrite, NULL);
delete []lpBuff;
CloseHandle(hFile);
}
InvalidateRect(hWnd, NULL, TRUE);
ShowWindow(hWnd, SW_SHOW);
return 0;
}
BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hDc;
switch (message)
{
case WM_PAINT:
hDc = BeginPaint(hWnd, &ps);
if (g_hDcBitmap)
{
SetMapMode(hDc, MM_ANISOTROPIC);
SetViewportExtEx(hDc, ps.rcPaint.right, ps.rcPaint.bottom, NULL);
SetWindowExtEx(hDc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL);
BitBlt(hDc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), g_hDcBitmap, 0, 0, SRCCOPY);
}
EndPaint(hWnd, &ps);
return TRUE;
case WM_COMMAND:
if (wParam == IDC_PTRSCR)
{
CreateThread(NULL, 0, ThreadSavingScreen, (LPVOID)hWnd, 0, NULL);
}
return TRUE;
case WM_CLOSE:
if (g_hDcBitmap)
{
DeleteDC(g_hDcBitmap);
DeleteObject(g_hBm);
}
EndDialog(hWnd, 0);
return TRUE;
default:
return FALSE;
}
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
return (int)DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINBOX), NULL, DlgProc);
}
HDC g_hDcBitmap;
HBITMAP g_hBm;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
RECT rect = {0};
HDC hDc;
if (!IsWindowVisible(hwnd)) return TRUE;
hDc = GetWindowDC(hwnd);
GetWindowRect(hwnd, &rect);
BitBlt(g_hDcBitmap, rect.left, rect.top, rect.right, rect.bottom, hDc, 0, 0, SRCCOPY);
ReleaseDC(hwnd, hDc);
return TRUE;
}
DWORD WINAPI ThreadSavingScreen(LPVOID lpParam)
{
HWND hWnd = (HWND)lpParam;
long lAspect = 0;
HDC hDc;
RECT rect = {0};
ShowWindow(hWnd, SW_HIDE);
while (IsWindowVisible(hWnd))
_asm nop;
if (!g_hDcBitmap)
{
hDc = GetDC(NULL);
g_hDcBitmap = CreateCompatibleDC(hDc);
g_hBm = CreateCompatibleBitmap(hDc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
SelectObject(g_hDcBitmap, g_hBm);
ReleaseDC(NULL, hDc);
}
else
{
SelectObject(g_hDcBitmap, GetStockObject(NULL_PEN));
Rectangle(g_hDcBitmap, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
}
EnumWindows(EnumWindowsProc, FALSE);
//save image to the file
HANDLE hFile = CreateFile("screenshot.bmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
BITMAPFILEHEADER bfh = {0};
BITMAPINFOHEADER bih = {0};
BITMAP bm = {0};
DWORD dwToWrite = 0;
DWORD dwSizeBuffer = 1;
LPBYTE lpBuff = NULL;
GetObject(g_hBm, sizeof(bm), (LPVOID)&bm);
bih.biSize = sizeof(bih);
bih.biWidth = bm.bmWidth;
bih.biHeight = bm.bmHeight;
bih.biBitCount = bm.bmBitsPixel;
bih.biPlanes = 1;
dwSizeBuffer = bm.bmWidth * bm.bmHeight * bm.bmBitsPixel / 8;
bfh.bfSize = sizeof(bfh) + sizeof(bih) + dwSizeBuffer;
bfh.bfOffBits = sizeof(bfh) + sizeof(bih);
bfh.bfType = 0x4d42;
lpBuff = new BYTE[dwSizeBuffer];
ZeroMemory((LPVOID)lpBuff, dwSizeBuffer);
GetDIBits(g_hDcBitmap, g_hBm, 0, bm.bmHeight, (LPVOID)lpBuff, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);
WriteFile(hFile, &bfh, sizeof(bfh), &dwToWrite, NULL);
WriteFile(hFile, &bih, sizeof(bih), &dwToWrite, NULL);
WriteFile(hFile, lpBuff, dwSizeBuffer, &dwToWrite, NULL);
delete []lpBuff;
CloseHandle(hFile);
}
InvalidateRect(hWnd, NULL, TRUE);
ShowWindow(hWnd, SW_SHOW);
return 0;
}
BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hDc;
switch (message)
{
case WM_PAINT:
hDc = BeginPaint(hWnd, &ps);
if (g_hDcBitmap)
{
SetMapMode(hDc, MM_ANISOTROPIC);
SetViewportExtEx(hDc, ps.rcPaint.right, ps.rcPaint.bottom, NULL);
SetWindowExtEx(hDc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL);
BitBlt(hDc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), g_hDcBitmap, 0, 0, SRCCOPY);
}
EndPaint(hWnd, &ps);
return TRUE;
case WM_COMMAND:
if (wParam == IDC_PTRSCR)
{
CreateThread(NULL, 0, ThreadSavingScreen, (LPVOID)hWnd, 0, NULL);
}
return TRUE;
case WM_CLOSE:
if (g_hDcBitmap)
{
DeleteDC(g_hDcBitmap);
DeleteObject(g_hBm);
}
EndDialog(hWnd, 0);
return TRUE;
default:
return FALSE;
}
}
выводит на окно и сохраняет в файл все что есть на экране:D
А теперь вруби клипак или фильмец через стандартный MediaPlayer, захвати своей прожкой экран - потом ВЫРУБИ проигрыватель(ВЫРУБИ обязательно), и посмотри ЧТО сохранилось в файле...
И что? И ничего! ;о) оверлеи так НЕ ЗАХВАТЫВАЮТСЯ. это область памяти где-то в видеокарте... На этом мои познания по ним закончились...
Хе хе ты прав не здравая фигня получается но это не повод опускать руки. Есть несколько способов обойти данную фишку. первый это влезть в поток видео а для этого необходимо написать свой DS DMO фильтр, но при использовании в wmplayer-е фильтр необходимо зарегистрировать в нем. это конечно неудобный способо но работать будет. второй это через DirectDraw получить поверхность которая содержит изображение используя клиперы или чето в этом духе, тут нужно спросить гуро по direct-у. да и почему именно DirectDraw потомучто для рендерезации фильмов плееры используют в основном DS фильтр VMR9 а он использует DirectDraw и Direct 3d ну и третий лазить по памяти процесса и искать ссылки на видео память бред какойто но реально. в случае с первым спобом you are wellcom:) могу помочь если это действительно тебе нужно.
Нет, первый способ - как-то через Ж.. ;о) а вдруг проигрыватель другой, тоже через оверлеи но устроен иначе? А насчет гуру DX, похоже их тут нет или они не знают этих нюансов :о( Ну что ж, буду искать сам, на других форумах...