利用VC++开发屏幕抓图程序实列

合集下载

C#屏幕捕获程序_C#屏幕抓图程序

C#屏幕捕获程序_C#屏幕抓图程序

string lpszOutput , // 无用,可以设定位"NULL"
IntPtr lpInitData // pture ( object sender , System.EventArgs e )
{
this.Visible = false ;
IntPtr dc1 = CreateDC ( "DISPLAY" , null , null , ( IntPtr ) null ) ;
//创建显示器的 DC
Graphics g1 = Graphics.FromHdc ( dc1 ) ;
//由一个指定设备的句柄创建一个新的 Graphics 对象
MyImage
=
new
Bitmap
(
Screen.PrimaryScreen.Bounds.Width
,
Screen.PrimaryScreen.Bounds.Height , g1 ) ;
//根据屏幕大小创建一个与之相同大小的 Bitmap 对象
(2).根据此位图创建一个和其一样的 Graphic 对象:
通过下面代码就可以实现此功能:
Graphics g2 = Graphics.FromImage ( MyImage ) ;
(3).获得当前屏幕和位图的句柄:
获得此二个对象的句柄是为了下一步实现对当前屏幕图象的捕获,程序中实现的具体捕 获的方法是把当前屏幕捕获到已经创建的位图对象中。具体实现代码如下:
[ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
private static extern IntPtr CreateDC (

c语言获取当前屏幕画面数据方法

c语言获取当前屏幕画面数据方法

c语言获取当前屏幕画面数据方法标题:深度解析:C语言获取当前屏幕画面数据方法在计算机编程领域,C语言作为一种广泛应用的编程语言,其在图形处理方面的应用也是非常丰富的。

今天,我们将深入探讨如何使用C语言获取当前屏幕画面数据的方法,希望通过本文的介绍,能够帮助读者更深入地理解这一重要的技术。

一、理论基础在开始介绍具体的方法之前,我们首先需要了解一些基础的理论知识。

获取当前屏幕画面数据的方法,实质上是通过图形处理技术来实现的。

在C语言中,我们可以利用图形处理库来对屏幕进行操作,从而获取画面数据。

这其中涉及到了像素、颜色模式、屏幕缓冲等相关概念,对这些知识的理解对于我们后续的操作非常重要。

二、方法详解1. 使用系统APIC语言作为一种底层语言,可以直接调用系统API来获取屏幕画面数据。

通过系统提供的函数,我们可以获取屏幕上每个像素的颜色信息,从而得到完整的画面数据。

这种方法比较底层,需要对系统API有一定的了解,但其灵活性和效率都是非常优秀的。

通过调用系统API,我们可以获取到实时的屏幕画面数据,为后续的图形处理操作提供了基础。

2. 使用图形处理库除了直接调用系统API,我们还可以使用一些图形处理库来获取屏幕画面数据。

这些库通常封装了一些常用的图形处理操作,可以简化我们的开发流程。

比较常用的图形处理库包括OpenGL、DirectX等,它们提供了丰富的功能和良好的兼容性,可以帮助我们更方便地获取屏幕画面数据。

三、个人观点对于C语言获取当前屏幕画面数据的方法,我个人认为需要结合实际应用场景来选择合适的方法。

如果是对画面数据进行实时处理,并且对性能要求较高,可以考虑直接调用系统API来获取数据;如果是在游戏开发等场景中,可以选择使用图形处理库来简化开发流程。

选择合适的方法是非常重要的,需要根据具体情况进行权衡。

总结回顾通过本文的介绍,我们对C语言获取当前屏幕画面数据的方法有了更深入的了解。

我们首先从理论基础入手,了解了相关的基础知识,然后介绍了两种常用的方法,并对它们进行了简要的比较。

用VC设计数码相机、扫描仪的图像采集程序

用VC设计数码相机、扫描仪的图像采集程序
("1+2()*3/45)(N1+%22&C,’><<,(J+7;’#=;<, (%#+&(,’#&#P,*)J+>),=),<,7#,N1+)4@/5:)}
Q46C7186-9/81:!;-96?:%5R@6/:() {%5R@6/:(#$733+%’P7;>’#);} D;;<7.A86-!%5R@6/:(6-.-@1&18S:K) {//使 用 参 数 (J+ 7;’#=;<,(%#+ &(,’#&#P,*)J+
+,-./012345,67-89:;41</345(6=>2:?3@AB034B3932?C,7:;D0;=E40F3@<0?G,D:;4H/=:IJ(*!"##,6/04;)
摘 要:KLM,8 技术规范定义了图像采集硬件与应用软件 之间的 通讯协议和编程接口标准。文章在解释该技术规范 的基础上,介绍如何用F0<:;NBOO来设计数码相机和扫描仪的 图像采集程序。 关键词:KLM,8 动态连接库;数据源管理器入口;消息循环; 文件传输与保存 /4%.*,0.:K/3A23B0P0B;?0=4=PKQ;04R3P043<;<?;4R;@R<=P?Q;@3 2@=?=B=N;4R;22N0B;?0=42@=5@;>>04504?3@P;B3(MS,)P=@B=>1 >:40B;?0=4T3?Q334<=P?Q;@3;22N0B;?0=4<;4R0>;53;BU:0<0?0=4 R3F0B3<CV;<3R=43W2N;04045?/3<23B0P0B;?0=4,?/0<2;23@3W2N;04 /=Q?=R3<054?/32@=5@;>04F0<:;NBOO ?=;BU:0@3?/30>;53 ?;X34TG9050?;N6;>3@;;4RAB;443@C

纯C#实现屏幕指定区域截屏

纯C#实现屏幕指定区域截屏

纯C#实现屏幕指定区域截屏以前在别的地⽅见过⼀个通过调⽤系统API实现屏幕截图的例⼦,从内⼼来说我不太喜欢在C#代码中出现这种情况,现在什么都讲“和谐”,我觉得这种做法就是破坏了我们的“和谐”代码,呵呵,开玩笑,有的时候,不通过系统API确实难以做到的。

下⾯讲述的就是怎么通过纯C#来实现屏幕截图,代码如下:1//截取全屏图象2private void btnFullScreen_Click(object sender, EventArgs e)3 {4//创建图象,保存将来截取的图象5 Bitmap image = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);6 Graphics imgGraphics = Graphics.FromImage(image);7//设置截屏区域柯乐义8 imgGraphics.CopyFromScreen(0, 0, 0, 0, new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height));9//保存10 SaveImage(image);11 }1213//保存图象⽂件14private void SaveImage(Image image)15 {16if (saveFileDialog.ShowDialog(this) == DialogResult.OK)17 {18string fileName = saveFileDialog.FileName;19string extension = Path.GetExtension(fileName);20if (extension == ".jpg")21 {22 image.Save(fileName, ImageFormat.Jpeg);23 }24else25 {26 image.Save(fileName, ImageFormat.Bmp);27 }28 }29 }这段代码其实很简单,可以设置截屏区域的位置和⼤⼩,只不过只能在.net 2.0环境中才能运⾏。

计算机图形学 使用VC开发绘图程序的基本方法

计算机图形学  使用VC开发绘图程序的基本方法

七、思考题(尽量做,计入成绩) :
1、为什么要用 CDC 定义一个对象来作图? Windows 使用与设备无关的图形设备环境进行显示 。MFC 基础类库定义了设备环境对象类----CDC 类。 因为使用的是 mfc,如果是 sdk 的话就得用 dc,这个 cdc 想当是一个给设备画画的笔。 2、如果要绘制多条直线,应该如何编程?
4、 VC 中编程环境中,工程(project)是什么意义?为什么要用 project 的方式管理代码?
Project 文件的扩展名是 dsp,这个文件中存放的是一个特定的工程,也就是特定的应用程序的有关信息, 每个工程都对应有一个 dsp 类型的文件。 clw 为扩展名的文件是用来存放应用程序中用到的类和资源的信 以 息的,这些信息是 VC 中的 ClassWizard 工具管理和使用类的信息来源。 因为用 project 的方式管理代码比较方便,可以看成是在一个文件夹下进行的。
3、 在 MyView.cpp 文件的 OnDraw 函数中加入如下代码。 pDC->MoveTo(100,100); pDC->LineTo(200,200); CPen *pOldPen; CPen dashPen; dashPen.CreatePen(PS_DASH,1,RGB(255,0,0)); pOldPen = pDC->SelectObject(&dashPen); pDC->LineTo(300,100); pDC->SelectObject(pOldPen); pDC->LineTo(400,200);
实验(No. 1
)题目:使用 VC 开发绘图程序的基本方法
实验目的及要求:
一、实验目的:
编写一个具有一定功能的 MFC 类库应用程序 (引入简单的视图/文档概念) 掌握 GDI 画图的基本方法, , 并调用系统函数画直线。

屏幕截图

屏幕截图

屏幕截图问题一:怎么用VC进行屏幕截图?答:在VC中进行屏幕截图可以分成几步:(1) 获得整个屏幕的DC,并创建一个与之兼容的DC。

CDC *pDesktopDC=GetDesktopWindow()->GetDC();CDC memDC;memDC.CreateCompatibleDC(pDesktopDC);(2)创建一个与屏幕大小相同的兼容位图。

CRect RectDesktop;GetDesktopWindow()->GetClientRect(&RectDesktop);CBitmap bmpdesktop;bmpdesktop.CreateCompatibleBitmap(pDesktopDC,RectDesktop.Width(),Re ctDesktop.Height());(3)把位图显示在客户区。

CRect rect;GetClientRect(&rect);CDC *pDC=this->GetDC();pDC->StretchBlt(0,0,rect.Width(),rect.Height(),pDesktopDC,0,0,RectDesktop. Width(),RectDesktop.Height(),SRCCOPY);这样就能完成了简单截图的功能。

猜想:(1)按理来说呢,要想截取某个程序的图像,只要获得该程序的DC,并将之复制一份即可。

(2)如果截取屏幕的某一区域的话,只需将区域范围保存下来,然后对复制的位图进行裁剪即可。

问题二:看下面的截图,大家是不是看着很别扭呢?这是使用上面的程序多次截图造成的。

咋一看很吃惊,这不是我想要的结果,但事实确实如此。

仔细想想也就能明白了。

那么怎么样才能不出现这种结果呢?我想应该是先清空客户区的图像,然后再截图。

也就是在截图开始前添加清空客户区图像的功能。

但是如果仅仅是要将背景图去掉的话,那也可以用背景色去填充整个客户区呀。

C#实现屏幕截图

C#实现屏幕截图
}
#region操作栏
private System.Windows.Forms.Button btnOk;
private System.Windows.Forms.Button btnSave;
private void btnSave_Click(object sender, EventArgs e)
this.btnOk.TabIndex = 22;
this.btnOk.Text = "完成";
this.btnOk.Visible = false;
this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
//
// btnSave
//
{
this.tiptext = new bel();
this.btnOk = new System.Windows.Forms.Button();
this.btnSave = new System.Windows.Forms.Button();
this.btnCancel = new System.Windows.Forms.Button();
}
btnOk.Visible = show;
btnSave.Visible = show;
btnCancel.Visible = show;
}
#endregion
#region获取屏幕
//引用API
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
= "tiptext";

利用VC5.0捕捉屏幕“热点”

利用VC5.0捕捉屏幕“热点”

利用VC5.0捕捉屏幕“热点”先来看看什么是屏幕"热点",当我们在Windows 95提供的帮助文件或上网浏览网页时,就指当鼠标移动到屏幕的某一块区域(例如一幅图像或一个按钮)内时,鼠标指针变成了一只"手",有时还会出现一些提示性的文字。

这图像或按钮所在的区域就是"热点"。

笔者用VC5.0在中文WINDOWS95平台上开发了一个实例程序,本文将通过这个具体实例讨论如何实现屏幕"热点"的捕捉。

如果在窗口中设置鼠标光标,则Windows95会向当前窗口发送WM_SETCURSOR消息。

窗口接受WM_SETCURSOR消息并作相应的处理。

在程序中我们通过判断鼠标当前位置来捕捉"热点"。

如果鼠标位于"热点"内,则设置"手"形指针并显示提示文字。

如果鼠标离开了"热点",则将鼠标指针恢复为原来的形状。

下面是具体的实现步骤。

1.生成一个窗体用VC的AppWizard(应用程序向导)生成一个工程项目Test,在生成过程中,指定窗体类型为CDialog based(对话框)形式。

2.在项目中增加资源将位图文件material.bmp和鼠标指针文件Hand.cur用Import(导入)方式增加到该项目的资源文件中。

分别给这两个资源指定ID号为IDB_PIC和IDC_HAND。

3.在窗体中增加控件在窗体中加入一个Picture(图像)控件。

属性设置如下:ID=IDC_PICTURE, TYPE=Bitmap,Image=IDB_PIC。

Visible,Group,Tabstop,Notify四项选中。

加入一个Button(按钮)控件。

属性设置如下:ID=IDC_BUTTON1,Visible, Tabstop两项选中。

加入一个Static Text(静态文本)控件,属性设置如下:ID=IDC_TEXT,Visible项不选中.4.增加相应的代码在VC下的ClassWizard(类向导)中,选择CTestDlg类的WM_SETCURSOR消息处理入口及其相互对应的成员函数OnSetCursor并作如下修改。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用VC++开发屏幕抓图程序实列在Windows操作系统中,当用户按下"PrintScreen"按钮后,Windows自动将当前屏幕的图像拷贝到系统剪贴板中,这时可以通过"画笔"这个小程序将剪贴板中的内容保存成图像文件,可以看出,如果需要将当前屏幕保存下来还是比较麻烦的,能否可以自己编写一个应用程序,自动将当前屏幕的内容保存到一个图像文件中去呢?这个答案是肯定的,本实例应用程序就是利用通用的热键管理DLL库实现的热键功能,在收到热键通知后截取屏幕的内容并保存到bmp文件中。

例如我们设置图片保存路径为c:\,热键为F9 + Control,然后按Change 按钮设置好热键,那么当我们按下CTRL+F9后,当前界面将以BMP图像文件的格式被保存在C:\目录下。

一、实现方法热键管理DLL实际上是一个键盘钩子,由它来监视系统的键盘事件。

如果有和程序登记符合的按键组合就通知该程序的窗口。

为了应用方便,本实例把它做成了一个标准的管理库来为其它的程序通过热键服务,它有两个输出函数:AddHotkey()和DeleteHotkey(),程序只需要调用这两个函数就可以了,如果编译之后不用改变热键,则只需要AddHotkey 就可以了。

DLL中的所有的全局变量都放在一个共享段中,定义如下:#pragma data_seg("shareddata")HHOOK hHook =NULL; //钩子句柄UINT nHookCount =0; //挂接的程序数目static UCHAR HotKey[MAX_KEY] = {0}; //热键虚拟键码static UCHAR HotKeyMask[MAX_KEY] = {0}; //组合掩码, control=4,alt=2,shift=1 static HWND hCallWnd[MAX_KEY] = {0}; //window handle associated with hotkey static int KeyCount =0;static UCHAR MaskBits =0; //00000 Ctrl=4 & Alt=2 & Shift=1#pragma data_seg()关于共享段,有几点重要的说明:一是必须在链接选项里指定该段为共享:一种方法是在project->settings->link->object/library中加上/section:shareddata,rws;第二种方法是在def文件的sections里加上一句shareddata read write shared;第三种指定共享段的方法在程序里加上一句#pragma comment(linker,"section:shareddata,rws")。

二是所有的变量必须初始化,否则链接程序会把它放到普通数据段。

三是如果不初始化变量,需要在段外用"__declspec(allocate("shareddata")) 变量类型变量名"的方式定义。

DLL中的两个输出函数分别用来添加/删除热键,函数代码如下:BOOL __declspec(dllexport) __stdcall AddHotkey(HWND hWnd,UCHARcKey,UCHAR cMask){BOOL bAdded=FALSE;for(int index=0;index<MAX_KEY;index++){if(hCallWnd[index]==0){hCallWnd[index]=hWnd;HotKey[index]=cKey;HotKeyMask[index]=cMask;bAdded=TRUE;KeyCount++;break;}}return bAdded;}//删除热键BOOL __declspec(dllexport) __stdcall DeleteHotkey(HWND hWnd, UCHAR cKey,UCHAR cMask){BOOL bRemoved=FALSE;for(int index=0;index<MAX_KEY;index++){if(hCallWnd[index]==hWnd){if(HotKey[index]==cKey&&HotKeyMask[index]==cMask){hCallWnd[index]=NULL;HotKey[index]=0;HotKeyMask[index]=0;bRemoved=TRUE;KeyCount--;break;}}}return bRemoved;}DLL中的钩子函数如下:LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) {BOOL bProcessed=FALSE;if(HC_ACTION==nCode){if((lParam&0xc0000000)==0xc0000000){// 有键松开switch(wParam){case VK_MENU:MaskBits&=~ALTBIT;break;case VK_CONTROL:MaskBits&=~CTRLBIT;break;case VK_SHIFT:MaskBits&=~SHIFTBIT;break;default: //judge the key and send messagebreak;}for(int index=0;index<MAX_KEY;index++){if(hCallWnd[index]==NULL)continue;if(IsWindow(hCallWnd[index])&&(HotKey[index]==wParam)&&(HotKeyMask[index]==Mask Bits)){SendMessage(hCallWnd[index],WM_HOTKEY,wParam,WM_KEYUP);bProcessed=TRUE;}}}else if((lParam&0xc000ffff)==1){ //有键按下switch(wParam){case VK_MENU:MaskBits|=ALTBIT;break;case VK_CONTROL:MaskBits|=CTRLBIT;break;case VK_SHIFT:MaskBits|=SHIFTBIT;break;default: //judge the key and send messagebreak;}for(int index=0;index<MAX_KEY;index++){if(hCallWnd[index]==NULL)continue;if(IsWindow(hCallWnd[index])&&(HotKey[index]==wParam)&&(HotKeyMask[index]==Mask Bits)){SendMessage(hCallWnd[index],WM_HOTKEY,wParam,WM_KEYDOWN);bProcessed=TRUE;}}}if(!bProcessed){ //一般按键事件,为监视键盘的程序留出余地for(int index=0;index<MAX_KEY;index++){if(hCallWnd[index]==NULL)continue;if(IsWindow(hCallWnd[index])&&(HotKey[index]==0)&&(HotKeyMask[index]==0)) SendMessage(hCallWnd[index],WM_HOTKEY,WM_HOTKEY,lParam);//lParam的意义可看MSDN中WM_KEYDOWN部分}}}return CallNextHookEx( hHook, nCode, wParam, lParam );}抓图程序是一个基于对话框的程序,它在建立对话框的时候调用前面的DLL,登记热键,因此需要将hook.lib添加到工程里,在程序里给出两个DLL函数的定义,也可以写个头文件,再包含进来以下代码:BOOL __declspec(dllexport)__stdcall AddHotkey(HWND,UCHAR key,UCHAR mask); BOOL __declspec(dllexport)__stdcall DeleteHotkey(HWND,UCHAR key,UCHAR mask);为了添加应用程序对热键通知事件的响应,程序中用的办法是重载WindowProc()函数,该函数代码如下:LRESULT CCaptureDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {if(message==WM_HOTKEY&&lParam==WM_KEYDOWN){ //lParam表示是按下还是松开,如果有多个热键,由wParam来区分SaveBmp();return FALSE;}…… //其它处理及默认处理}将屏幕图像保存到BMP文件中的任务是由函数SaveBmp()来完成的,具体实现参见代码部分。

另外为了顺利实现屏幕抓图,程序中还实现了"托盘"功能,由于这一部分本书在实例中已经专门介绍过了,所以不再赘述,读者朋友可以参考相关实例。

最后需要提醒读者朋友们注意的是,源程序的编译与使用时要先编译hook.dll并将其放在系统目录(win2000/NT是system32,98/ME是system),然后编译对话框程序运行即可。

二、编程步骤1、启动Visual C++,生成一个DLL项目和一个基于对话框的应用程序项目,并将两个项目分别命名为"Hook"和"Capture";2、在"Hook"项目中导出AddHotkey()、DeleteHotkey()函数;3、在"Capture"项目中按照图一所示设置对话框的界面,具体设置参见代码部分;4、使用Class Wizard在"Capture"项目中添加按钮的鼠标单击消息响应函数,并重载对话框的WindowProc()函数;5、添加代码,编译运行程序。

相关文档
最新文档