问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

VB 如何实现DX\GDI 技术截屏?

发布网友 发布时间:2022-05-22 02:56

我来回答

4个回答

热心网友 时间:2024-03-06 00:17

屏幕抓图至少分为3个步骤:

(1) 启用鼠标指针捕获。

(2) 在鼠标指针所在处的窗口进行绘图,提示抓图的目标。

(3) 选定目标窗口时,将目标窗口的画面保存为自定义的位图并终止鼠标指针捕获。

以下是具体的编程步骤:

(1)在Visual C++ .NET中按照GDI+程序的框架新建一个基于对话框的项目ScreenCapture,然后准备好一个外形为相机的光标文件(*.cur),将之引入资源管理器(IDC_CAMERA)。接着在CScreenCaptureDlg类中加入以下两个全局变量:

HWND hwndCapture;

Crect rectCapture;

(2)通过类向导加入对WM_MOUSEMOVE及WM_LBUTTONUP事件的响应函数,分别如下所示。

void CScreenCaptureDlg::OnMouseMove(UINT nFlags, CPoint point)

{

//如果用户按隹鼠标左键不放,则开始抓取图片

if(nFlags==MK_LBUTTON){

//隐藏程序窗口,以免影响在抓取时的“视野”

ShowWindow(SW_HIDE);

//载入“照相机”鼠标指针,开始追踪鼠标指针的移动

HCURSOR cur=LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CAMERA));

SetCursor(cur);

SetCapture();

//获得鼠标指针所在窗口的句柄

this->ClientToScreen(&point);

hwndCapture=(HWND)::WindowFromPoint(point);

//取得屏幕的设备环境句柄,以便在屏幕的任何位置绘图

HDC hDC=::GetDC(NULL);

//建立一个红色的画笔

HPEN hPen=CreatePen(PS_INSIDEFRAME,6,RGB(255,0,0));

//将绘图模式设为R2_NOTXORPEN,在绘图时可以不破坏原有的背景

int nMode=SetROP2(hDC,R2_NOTXORPEN);

HPEN hpenOld=(HPEN)SelectObject(hDC,hPen);

//得到鼠标指针所在窗口的区域

::GetWindowRect(hwndCapture,&rectCapture);

//在鼠标指针所在处的窗口四周画一红色的矩形,做为选定时的提示

POINT pt[5];

pt[0]=CPoint(rectCapture.left,rectCapture.top);

pt[1]=CPoint(rectCapture.right,rectCapture.top);

pt[2]=CPoint(rectCapture.right,rectCapture.bottom);

pt[3]=CPoint(rectCapture.left,rectCapture.bottom);

pt[4]=CPoint(rectCapture.left,rectCapture.top);

::Polyline(hDC,pt,5);

//延时后再重绘红色矩形,这样不会破坏原有的内容

Sleep(100);

::Polyline(hDC,pt,5);

::SelectObject(hDC,hpenOld);

::ReleaseDC(NULL,hDC);

}

CDialog::OnMouseMove(nFlags, point);

}

void CScreenCaptureDlg::OnLButtonUp(UINT nFlags, CPoint point)

{

// 得到鼠标指针所在窗口的区域宽、高

int nWidth=rectCapture.Width();

int nHeight=rectCapture.Height();

HDC hdcScreen,hMemDC;

HBITMAP hBitmap,hOldBitmap;

//建立一个屏幕设备环境句柄

hdcScreen=CreateDC("DISPLAY",NULL,NULL,NULL);

hMemDC=CreateCompatibleDC(hdcScreen);

//建立一个与屏幕设备环境句柄兼容、与鼠标指针所在窗口的区域等大的位图

hBitmap=CreateCompatibleBitmap(hdcScreen,nWidth,nHeight);

//把新位图选到内存设备描述表中

hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);

//把屏幕设备描述表拷贝到内存设备描述表中

BitBlt(hMemDC,0,0,nWidth,nHeight,hdcScreen,rectCapture.left,rectCapture.top,SRCCOPY);

DeleteDC(hdcScreen);

DeleteDC(hMemDC);

//返回位图句柄

//打开剪贴板,并将位图拷到剪贴板上

OpenClipboard();

EmptyClipboard();

SetClipboardData(CF_BITMAP,hBitmap);

//关闭剪贴板

CloseClipboard();

MessageBox("屏幕内容已经拷到剪贴板!");

ReleaseCapture();

//恢复窗口显示模式

ShowWindow(SW_NORMAL);

CDialog::OnLButtonUp(nFlags, point);

}

至此,一个具有专业效果的屏幕抓图程序的核心已经搞定。

热心网友 时间:2024-03-06 00:17

这需要参考一下微软的Direct SDK

热心网友 时间:2024-03-06 00:18

汗了,不用API,你怎么调DX?……肯定要用API了。

热心网友 时间:2024-03-06 00:19

没有API,就象是巧妇难为无米之炊啊~~~~
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
肺气肿吃什么食物最好 吃什么对肺气肿好 肺气肿老人吃什么水果好 世界乐坛唱功排行? 全球唱功排名? 全球唱功排名 MariahCarey与CelineDion谁唱歌唱得好些?或者谁的唱功较好? Mariah Carey 与 Celine Dion谁唱歌唱得好些?或者谁的唱功较好 国家水费多少钱一吨 国家水费标准是多少一吨?多少水才算一吨 水费是多少钱一吨 c++怎么截屏啊,得到整个屏幕的HBitmap 我截取的视频在V3上为什么不是瞒屏幕 如何从桌面中获取一块区域,然后计算各种颜色的个数 VC++中,什么叫内存设备上下文 VC++ SDK编程 HBITMAP 是什么结构 怎样在客户端获得屏幕图像,然后发送给服务器端??? 索尼数码相机P72配件? 索尼相机官方配件哪里购买最合适 索尼数码相机送什么配件? 索尼的相机配件里有没有GPS记录仪? 索尼运动相机X3000的指握柄好用吗? 东奔西窜的窜的拼音怎么写 请问”东逃西窜”是什么意思 我想知道酒桌上的规矩,敬酒方面,还就就是酒桌上客套的话,或者说经常比较拉格式的话? 酒桌上敬酒的规矩是怎样的? 喝酒应该先敬谁 有关去的四字词语 我是个刚出月子的宝妈,一直没工作,想在网上开个店,有没有那种不太耗费精力的平台可以用啊? 去字怎么组词四字在前面 内存有哪些设备名 综偶像同人,最好里面有恶作剧之吻 求综影视耽美文 最好综穿的世界有恶作剧之吻 MFC中pOldPen=pDC->SelectObject(pNewPen) 求综影视恶作剧之吻世界女主和男主互换身体,这本叫什么 求综影视,如穿越恶作剧之吻,穿越成清朝的太子,老四老八都成的bl小说 916735972@qq.com 综影视文 不要琼瑶,流星花园,恶作剧之吻,美男的文(因为已经有很多了) 求百度云盘 快穿恶作剧之吻袁冰 求综影文,有变形金刚的 为什么<恶作剧之吻>要叫做恶作剧之吻呢,剧中有出现过恶作剧的吻吗? 求穿越到偶像剧里的耽美文 冰封王座不死族兵种搭配 不死族最强兵种搭配(详细些) 魔兽3不死族的最好兵种配发! 魔兽争霸不死族的兵种一般怎么搭配? 不死族兵种如何配置攻击效果最高? 魔兽争霸不死族最佳的兵种英雄配合 魔兽争霸中不死族的战术有哪些,包括兵种配置? 魔兽不死族兵种要怎么配最好啊 = = 魔兽争霸3冰封王座中不死族兵种该怎么搭配?