Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> захват экрана полноэкранный мультимедиа приложений, как это делает Fraps? 
V
    Опции темы
ano360
Дата 30.4.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

Репутация: нет
Всего: нет



Как можно получить содержание экрана полноэкранного приложения, любой компьютерной игры в частности, как это делает Fraps ??
Возможно ли это сделать через DirectDraw ? и если да то какую комбинацию флагов при установке уровня доступа нужно указвать?


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
ano360
Дата 1.5.2009, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

Репутация: нет
Всего: нет



Не знаю как конкретно это делает Fraps но проблема в моем случае была решена так:
Инициализируем DirectDraw, устанавливаем нормальный уровень доступа
запускаем интереасующее нас прилоежние
и дальше по таймеру или там по нажатию горячей клавиши забираем с primsurf данные.
ну вот код может понадобится кому:

Данный код по баттон 1 инициализирует DirectDraw
по баттон 3 или Shift+Ctrl+P копирует данные с  primsurf на поверхность заднего плана
по нажатию баттон2 копирует то что было сохранено с заднего буфера на передний тем самыым отображая все что было сохранено на экране
код писался только для проверки работоспособности метода
Код

// EveMiningBotDlg.cpp : implementation file
//
#pragma comment(lib,"ddraw.lib")
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"dxguid.lib")
#include "stdafx.h"
#include "EveMiningBot.h"
#include "EveMiningBotDlg.h"
#include "ddraw.h"
#include "d3d9.h"
#include "d3dx9.h"


#define WM_KICKIDLE 0x036A
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
IDirectDraw7 *IDD7;
IDirectDrawSurface7 *psurf;
IDirectDrawSurface7 *ssurf;
DDSURFACEDESC2 sur_struct;
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CEveMiningBotDlg dialog




CEveMiningBotDlg::CEveMiningBotDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CEveMiningBotDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CEveMiningBotDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_PIC, pic);
}

BEGIN_MESSAGE_MAP(CEveMiningBotDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_BN_CLICKED(IDC_BUTTON1, &CEveMiningBotDlg::OnBnClickedButton1)
    ON_BN_CLICKED(IDC_BUTTON2, &CEveMiningBotDlg::OnBnClickedButton2)
    
    ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
    ON_BN_CLICKED(IDC_BUTTON3, &CEveMiningBotDlg::OnBnClickedButton3)
END_MESSAGE_MAP()


// CEveMiningBotDlg message handlers

BOOL CEveMiningBotDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here

    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CEveMiningBotDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CEveMiningBotDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CEveMiningBotDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}


void CEveMiningBotDlg::OnBnClickedButton1()
{    HRESULT hr;

hr=DirectDrawCreateEx(NULL,(VOID**)&IDD7,IID_IDirectDraw7,NULL);
if(FAILED(hr))MessageBox(_T("не удалось инициализровать"));
hr=IDD7->SetCooperativeLevel(m_hWnd,/*DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_ALLOWMODEX*/DDSCL_NORMAL);
if(FAILED(hr))MessageBox(_T("не удалось установить уровень доступа"));

memset(&sur_struct,0,sizeof(DDSURFACEDESC2));
sur_struct.dwSize = sizeof(DDSURFACEDESC2);
sur_struct.dwFlags = DDSD_CAPS; 
sur_struct.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE ;

hr=IDD7->CreateSurface(&sur_struct,&psurf,NULL);
if(FAILED(hr))MessageBox(_T("не удалось создать поверхность"));

memset(&sur_struct,0,sizeof(DDSURFACEDESC2));
sur_struct.dwSize = sizeof(DDSURFACEDESC2);
sur_struct.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
sur_struct.ddsCaps.dwCaps  = DDSCAPS_OFFSCREENPLAIN;
sur_struct.dwHeight =1280;
sur_struct.dwWidth = 800;
sur_struct.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY;


hr=IDD7->CreateSurface(&sur_struct,&ssurf,NULL);
if(FAILED(hr))MessageBox(_T("не удалось создать поверхность"));

}

void CEveMiningBotDlg::OnBnClickedButton2()
{


    HRESULT hr=psurf->Blt(0,ssurf,0,DDBLT_WAIT,0);
    if(FAILED(hr))MessageBox(_T("не скопировать на псёрф"));

    // TODO: Add your control notification handler code here
}

LRESULT CEveMiningBotDlg::OnKickIdle(WPARAM, LPARAM lCount){
    if(GetAsyncKeyState(VK_CONTROL)&& GetAsyncKeyState(VK_SHIFT)&& GetAsyncKeyState(0x50))
        OnBnClickedButton3();    

return true;
}

void CEveMiningBotDlg::OnBnClickedButton3()
{



    HRESULT hr=ssurf->Blt(0,psurf,0,DDBLT_WAIT,0);
if(FAILED(hr))MessageBox(_T("не скопировать на ссёрф"));

    // TODO: Add your control notification handler code here
}




--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0610 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.