直接读取------- 显存

broaden 2002-03-11 04:08:48
请教高手,怎么样才能直接读取显存的内容??
...全文
628 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fiven_Luo 2002-03-18
  • 打赏
  • 举报
回复
UP
broaden 2002-03-18
  • 打赏
  • 举报
回复
有是么可以直接生成MPEG-1,2,3,4的接口吗?

有这方面的算法资料吗?
Fiven_Luo 2002-03-17
  • 打赏
  • 举报
回复
帮你UP一下
broaden 2002-03-17
  • 打赏
  • 举报
回复
高手呢?
broaden 2002-03-16
  • 打赏
  • 举报
回复

也不是直接传送,有自己的编码算法.

对了讨论一下,我要读屏幕内容再自己压缩,但是读显存是比内存慢很多的,所以本来想用GDI函数实现的,就像ATField(field)上面所写的,但是我像这样获得的屏幕图像内容其实Windows也是要读显存的,这样的速度应该更慢,对不对??

那还有什么更好的方法吗?


xpf_2000 2002-03-16
  • 打赏
  • 举报
回复
这么多高手,顺便问一下,我在做一个小游戏时,需要在游戏过程中调用
一个对话框,用 m_dialog.DoModal (); 有时能显示有时不能。请多指教。
broaden 2002-03-15
  • 打赏
  • 举报
回复
也不是直接传送,有自己的编码算法.

对了讨论一下,我要读屏幕内容再自己压缩,但是读显存是比内存慢很多的,所以本来想用GDI函数实现的,就像ATField(field)上面所写的,但是我像这样获得的屏幕图像内容其实Windows也是要读显存的,这样的速度应该更慢,对不对??

那还有什么更好的方法吗?
sam1111 2002-03-14
  • 打赏
  • 举报
回复
有没有搞错,
读显存中的东西直接传送?
死定了
ATField 2002-03-14
  • 打赏
  • 举报
回复
创建Surface的话一般会影响屏幕内容。
抱歉我没有可推荐的好书,我是看MSDN的。
ATField 2002-03-14
  • 打赏
  • 举报
回复
我看你是不是要截获屏幕输出?可用以下代码:
m_pdcDisplay = new CDC;

m_pdcDisplay->CreateDC( "DISPLAY", NULL, NULL, NULL );

int nDC = m_pdcDisplay->SaveDC();

// read screen contents

m_pdcDisplay->RestoreDC( nDC )
broaden 2002-03-14
  • 打赏
  • 举报
回复
发给你了
潘李亮 2002-03-14
  • 打赏
  • 举报
回复
发一份邮件到我的 信箱来,我有一个小的DDraw函数库,有你要的功能
Email:nhsoft@263.net
baoch110 2002-03-14
  • 打赏
  • 举报
回复
关注
关注
broaden 2002-03-14
  • 打赏
  • 举报
回复
问一句,创建surface不会影响屏幕原本显示的东西吧,因为我要传送屏幕上的内容。surface是不是只是一个逻辑上的东西?

还有推荐一本好的directx的书吧
broaden 2002-03-14
  • 打赏
  • 举报
回复
真感谢你,希望以后有问题大家能探讨探讨。
ATField 2002-03-14
  • 打赏
  • 举报
回复
忘了说一句,上面没有错误检查的。
ATField 2002-03-14
  • 打赏
  • 举报
回复
DDLOCK_WAIT | DDLOCK_NOSYSLOCK
错了,不好意思。
ATField 2002-03-14
  • 打赏
  • 举报
回复
用DirectDraw,创建PrimarySurface,然后Lock之,就可以得到显存地址,读写完后再Unlock()。具体的有点复杂,一句两句说不清,最好看书或参考MSDN。
算了,还是给你代码吧。
//初始化
HRESULT hRet = DirectDrawCreateEx( NULL, (VOID**)&m_pDirectDraw, IID_IDirectDraw7, NULL );

if(hRet != DD_OK)
{
OUTPUT_ERROR( hRet );
THROW( ERR_DIRECTDRAWINITFAILED );
return;
}

// Step 2: Set the cooperative level
hRet = m_pDirectDraw->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
// Step 3:Set display mode
hRet = m_pDirectDraw->SetDisplayMode( GAMERES_X, GAMERES_Y, GAMECOLORBITDEPTH, 0, 0 );

// Step 4: Create a primary surface with one backsurface
DDSURFACEDESC2 ddsd;

ZeroMemory( &ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
hRet = m_pDirectDraw->CreateSurface( &ddsd, &m_pDDSPrimary, NULL );

//lock
DDSURFACEDESC2 ddsdPrimary;
ddsdPrimary.dwSize = sizeof(DDSURFACEDESC2);

hRes = m_pDDSPrimary->Lock( NULL, &ddsdPrimary, DDLOCK_WAIT, DDLOCK_NOSYSLOCK, 0 );

LPBYTE lpbyMemory = (LPBYTE)ddsdPrimary.lpSurface;
// do some thing
// Unlock
m_pDDSPrimary->Unlock(NULL);
broaden 2002-03-14
  • 打赏
  • 举报
回复
高手呢?
linshao16 2002-03-11
  • 打赏
  • 举报
回复
关注
加载更多回复(4)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧