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,就象是巧妇难为无米之炊啊~~~~