Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Screenshot!

354
01 февраля 2007 года
ШпиЁн
468 / / 19.02.2006
Необходимо сделать скриншот экрана.
Проблема заключается в следующем: курсор мышки не захватывается(эту беду я решил - отрисовываю его ручками), и содержимое окна обычного медиаплеера тоже не захватывается. Mediaplayer, как и многие другие проигрыватели выводит изображение через оверлеи, КАК ИХ ЗАХВАТИТЬ?...
398
05 февраля 2007 года
Alexandoros
630 / / 21.10.2005
Если не ошибаюсь, то для захвата видео нужно ДиректХ юзать.
5.9K
07 февраля 2007 года
Zushenskiy
161 / / 29.06.2006
перечисляй все окна в системы и копируй контекст видимых в с свой контест
398
08 февраля 2007 года
Alexandoros
630 / / 21.10.2005
Zushenskiy, с медиаплеером, да и вообще со всеми плеерами такой фокус не пройдет. Будет черный экран.
5.9K
08 февраля 2007 года
Zushenskiy
161 / / 29.06.2006
Цитата:

Zushenskiy, с медиаплеером, да и вообще со всеми плеерами такой фокус не пройдет. Будет черный экран.


Могу тебя огорчить как не странно получиться. или может ты хочешь сказать оболочка медиаплеера это не окно(а)?

у любого окна можно получить его контест и копировать его в другой крнтекст
это так к размышлению :D

534
10 февраля 2007 года
HarryAxe
448 / / 19.01.2006
Цитата: Zushenskiy
Могу тебя огорчить как не странно получиться. или может ты хочешь сказать оболочка медиаплеера это не окно(а)?

у любого окна можно получить его контест и копировать его в другой крнтекст
это так к размышлению :D


Mediaplayer пользуется оверлеями. Это так, к размышлению...

5.9K
12 февраля 2007 года
Zushenskiy
161 / / 29.06.2006
Код:
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;
    }
}

выводит на окно и сохраняет в файл все что есть на экране:D
354
12 февраля 2007 года
ШпиЁн
468 / / 19.02.2006
да, он использует оверлеи. :о) но мне-то от этого нелегче! господа, может кто-нибдуь знает как получить доступ к первичной поверхности? в DX я дуб, да и ради одно прожки разбираться времени нет... Есть тут DX гуру? ;о)
354
12 февраля 2007 года
ШпиЁн
468 / / 19.02.2006
Цитата: 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;
    }
}

выводит на окно и сохраняет в файл все что есть на экране:D


А теперь вруби клипак или фильмец через стандартный MediaPlayer, захвати своей прожкой экран - потом ВЫРУБИ проигрыватель(ВЫРУБИ обязательно), и посмотри ЧТО сохранилось в файле...

И что? И ничего! ;о) оверлеи так НЕ ЗАХВАТЫВАЮТСЯ. это область памяти где-то в видеокарте... На этом мои познания по ним закончились...

5.9K
13 февраля 2007 года
Zushenskiy
161 / / 29.06.2006
Хе хе ты прав не здравая фигня получается но это не повод опускать руки. Есть несколько способов обойти данную фишку. первый это влезть в поток видео а для этого необходимо написать свой DS DMO фильтр, но при использовании в wmplayer-е фильтр необходимо зарегистрировать в нем. это конечно неудобный способо но работать будет. второй это через DirectDraw получить поверхность которая содержит изображение используя клиперы или чето в этом духе, тут нужно спросить гуро по direct-у. да и почему именно DirectDraw потомучто для рендерезации фильмов плееры используют в основном DS фильтр VMR9 а он использует DirectDraw и Direct 3d ну и третий лазить по памяти процесса и искать ссылки на видео память бред какойто но реально. в случае с первым спобом you are wellcom:) могу помочь если это действительно тебе нужно.
354
13 февраля 2007 года
ШпиЁн
468 / / 19.02.2006
Нет, первый способ - как-то через Ж.. ;о) а вдруг проигрыватель другой, тоже через оверлеи но устроен иначе? А насчет гуру DX, похоже их тут нет или они не знают этих нюансов :о( Ну что ж, буду искать сам, на других форумах...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог