编程思路(API 编程):先调用 GetForegroundWindow 获取当前活动程序窗口句柄,然后调用 GetWindowDC 获取窗口的设备句柄(或 GetDC 函数),调用 BitBlt 位图传输函数将位图拷贝到兼容的设备场景中(拷贝时可以指定位置和大小),最后保存位图文件。
=============================
以下源代码内容转自 CSDN 论坛。
要想完成这个功能,首先要了解一下在C#中如何调用API(应用程序接口)函数。虽然在Net框架中已经提供了许多类库,这些类库的功能也十分强大,但对于一些Windows底层编程来说,还是要通过调用这些API函数才可以实现。所有API都在"Kernel"、"User "和"GDI"三个库中得以运行:其中"Kernel",他的库名为 "KERNEL32DLL", 他主要用于产生与 *** 作系统之间的关联,譬如:程序加载,上下文选择,文件输入输出,内存管理等等。"User "这个类库在Win32中名叫 "USER32DLL"。 它允许管理全部的用户接口。譬如:窗口 、菜单 、对话框 、图标等等。"GDI"(图象设备接口),它在Win32中的库名为:"GDI32dll",它是图形输出库。使用GDI Windows"画"出窗口、菜单以及对话框等;它能创建图形输出;它也能保存图形文件。由于本文所涉及到是图象问题,所有调用的类库是"GDI32dll"。在本文程序中我们使用的API函数是"BitBlt",这个函数对于广大程序员来说,一定不感觉到陌生,因为在图象处理方面他的用途是相对广的,在用其他程序语言编程中,时常也要和他打交道。在Net FrameWork SDK中有一个名字空间"SystemRuntimeInteropServices",此名字空间提供了一系列的类来访问COM对象,和调用本地的API函数。下面是在C#中声明此函数:
[ SystemRuntimeInteropServicesDllImportAttribute ( "gdi32dll" ) ]
private static extern bool BitBlt (
IntPtr hdcDest , // 目标 DC的句柄
int nXDest ,
int nYDest ,
int nWidth ,
int nHeight ,
IntPtr hdcSrc , // 源DC的句柄
int nXSrc ,
int nYSrc ,
SystemInt32 dwRop // 光栅的处理数值
) ;
通过上面这个声明,就可以在下面的代码中使用此函数了。
下面是用C#做屏幕捕获程序的具体实现步骤:
(1)首先要获得当前屏幕的graphic对象,通过以下代码可以实现:
Graphics g1 = thisCreateGraphics ( ) ;
(2)创建一个Bitmap对象,并且这个Bitmap对象的大小是当前屏幕:
首先要获得当前屏幕的大小,通过名字空间"SystemWindowsForms"中的"Screen"类的GetWorkingArea()方法,可以实现。下面是得到当前屏幕的长(Height)和宽(Width):
Rectangle rect = new Rectangle ( ) ;
rect = ScreenGetWorkingArea ( this ) ;
"屏幕宽"= rectWidth ;
"屏幕长"= rectHeight ;
至此就可以得到我们想要的Bitmap了,通过下列语句可以实现:
Image MyImage = new Bitmap ( rectWidth , rectHeight , g1 ) ;
//创建以屏幕大小为标准的位图
(3)获得当前屏幕和此Bitmap对象的DC,这可以通过下列语句实现:
//得到屏幕的DC
IntPtr dc1 = g1GetHdc ( ) ;
//得到Bitmap的DC
IntPtr dc2 = g2GetHdc ( ) ;
(4)调用API函数,把当前屏幕拷贝到创建的Bitmap中:
BitBlt ( dc2 , 0 , 0 , rectWidth , rectHeight , dc1 , 0 , 0 , 13369376 ) ;
(5)释放当前屏幕和此Bitmap对象的DC,通过下面代码可以实现:
//释放掉屏幕的DC
g1ReleaseHdc ( dc1 ) ;
//释放掉Bitmap的DC
g2ReleaseHdc ( dc2 ) ;
(6)保存Bitmap对象,形成jpg:
MyImageSave ( @"c:\Capturejpg" , ImageFormatJpeg );
当然你也可以根据自己的需要,把屏幕以其他的格式来保存,如果你想把保存为位图文件,可以把"ImageFormatJpeg"改换成"ImageFormatBmp";想把保存为Gif文件,就把"ImageFormatJpeg"改换成"ImageFormatGif"。你可以保存的文件类型大概有十多种,这里就不一一介绍了,当然你也要相应改变保存文件的后缀。
用C#来捕获屏幕的源程序代码(Capturecs):
了解上面的这些步骤的实现方法,就可以得到用C#捕获屏幕的源程序,如下:
using System ;
using SystemDrawing ;
using SystemCollections ;
using SystemComponentModel ;
using SystemWindowsForms ;
using SystemData ;
using SystemDrawingImaging ;
public class Form1 : Form
{
private Button button1 ;
private SystemComponentModelContainer components = null ;
public Form1 ( )
{
//初始化窗体中的各个组件
InitializeComponent ( ) ;
}
// 清除程序中使用过的资源
protected override void Dispose ( bool disposing )
{
if ( disposing )
{
if ( components != null )
{
componentsDispose ( ) ;
}
}
baseDispose ( disposing ) ;
}
private void InitializeComponent ( )
{
button1 = new Button ( );
SuspendLayout ( ) ;
button1Location = new SystemDrawingPoint ( 64 , 40 ) ;
button1Name = "button1" ;
button1Size = new SystemDrawingSize ( 80 , 32 ) ;
button1TabIndex = 0 ;
button1Text = "捕获" ;
button1Click += new SystemEventHandler ( button1_Click ) ;
AutoScaleBaseSize = new SystemDrawingSize ( 6 , 14 ) ;
ClientSize = new SystemDrawingSize ( 216 , 125 ) ;
ControlsAdd ( button1 ) ;
MaximizeBox = false ;
MinimizeBox = false ;
Name = "Form1" ;
Text = "C#捕获当前屏幕!" ;
ResumeLayout ( false ) ;
}
//声明一个API函数
[ SystemRuntimeInteropServicesDllImportAttribute ( "gdi32dll" ) ]
private static extern bool BitBlt (
IntPtr hdcDest , // 目标 DC的句柄
int nXDest ,
int nYDest ,
int nWidth ,
int nHeight ,
IntPtr hdcSrc , // 源DC的句柄
int nXSrc ,
int nYSrc ,
SystemInt32 dwRop // 光栅的处理数值
) ;
static void Main ( )
{
ApplicationRun ( new Form1 ( ) ) ;
}
private void button1_Click ( object sender , SystemEventArgs e )
{
//获得当前屏幕的大小
Rectangle rect = new Rectangle ( ) ;
rect = ScreenGetWorkingArea ( this ) ;
//创建一个以当前屏幕为模板的图象
Graphics g1 = thisCreateGraphics ( ) ;
//创建以屏幕大小为标准的位图
Image MyImage = new Bitmap ( rectWidth , rectHeight , g1 ) ;
Graphics g2 = GraphicsFromImage ( MyImage ) ;
//得到屏幕的DC
IntPtr dc1 = g1GetHdc ( ) ;
//得到Bitmap的DC
IntPtr dc2 = g2GetHdc ( ) ;
//调用此API函数,实现屏幕捕获
BitBlt ( dc2 , 0 , 0 , rectWidth , rectHeight , dc1 , 0 , 0 , 13369376 ) ;
//释放掉屏幕的DC
g1ReleaseHdc ( dc1 ) ;
//释放掉Bitmap的DC
g2ReleaseHdc ( dc2 ) ;
//以JPG文件格式来保存
MyImageSave ( @"c:\Capturejpg" , ImageFormatJpeg );
MessageBoxShow ( "当前屏幕已经保存为C盘的capturejpg文件!" ) ;
}
}
//---------------------------------------------------------------------------
#include <windowsh>
#define TITLE "一二三" /窗口标题/
int main(void)
{
HWND hwnd;
hwnd=FindWindow(NULL,TITLE);
PostMessage(hwnd,WM_KEYDOWN,VK_RETURN,1);
PostMessage(hwnd,WM_KEYUP,VK_RETURN,1);
return 0;
}
//---------------------------------------------------------------------------
一、屏幕 *** 作函数
1 clrscr()清除字符窗口函数
2 window()字符窗口函数
3 gotoxy()光标定位函数
4 clreol() 清除光标行尾字符函数
5 insline() 插入空行函数
6 delline() 删除一行函数
7 gettext() 拷进文字函数
8 puttext() 拷出文字函数
9 movetext() 移动文字函数
二、字符属性函数
10 textmode() 文本模式函数
11 highvideo()高亮度函数
12 lowvideo() 低亮度函数
13 normvideo(void);
14 textcolor() 文本颜色函数
15 textattr() 文本属性函数
16textbackground() 文本背景函数
三、 屏显状态函数
17 wherex() 光标处x坐标函数
18 wherey() 光标处y坐标函数
19 gettextinfo() 获取文本窗口信息函数
2 window()字符窗口函数
功能: 函数window()用于在指定位置建立一个字符窗口。
用法: 此函数调用方式为 void window(int left,int top,int right,int bottom);
说明: 函数中参数left,top为窗口左上角坐标;right,bottom为其右下角坐标。
若有一个坐标是无效的,则window()函数不起作用。一旦该函数调用成功,那么所有定位坐标都是相对于窗口的,而不是相对于整个屏幕。但是建立窗口所用的坐标总是相对整个屏幕的绝对坐标,而不是相对当前窗口的相对坐标。这样用户就可以根据各种需要建立多个互不嵌套的窗口。
此函数的头文件为conioh。
返回值:无
例: 调用这个函数的实现例见3gotoxy()函数的例子中。
gotoxy()光标定位函数
功能: 函数gotoxy()将字屏幕上的光标移到当前窗口指定的位置上。
用法: 这个函数调用方式为void gotoxy(int x,int y);
说明: 括号里x,y是, 光标定位的坐标,如果其中一个坐标值无效(如坐标超界),那么光标不会移动。
此函数在字符状态(有时称为文本状态)下经常用到 ,其相应的头文件为conioh
返回值:无
例: 下面程序建立两个窗口,然后在窗口里显示字符,字符的位置是调用该函数确定的。
#include"conioh>
void border(int startx,int starty,int endx,int endy)
{
register int i;
gotoxy(1,1);
for(i=0;i<=endx-startx;i++)
putch('-');
gotoxy(1,endy-starty);
for(i=0;i<=endx-startx;i++)
putch('-');
for(i=2;i<=endy-starty;i++){
gotoxy(1,i);
putch('1');
gotoxy(endx-startx+1,i);
putch('1');
}
}
main()
{
void border(int,int,int,int);
clrscr();
window(6,8,38,12);
border(6,8,38,12);
gotoxy(2,2);
printf("window 1");
window(8,16,40,24);
border(8,16,40,24);
gotoxy(3,2);
printf("window 2");
getch();
}
三、 屏显状态函数
这里提供三个在文本模式下屏幕显示状态的函数
17 wherex() 光标处x坐标函数
功能: 函数wherex()返回当前窗口中光标处横向坐标。
用法: 此函数调用方式为int wherex(void);
说明: 这个函数调用无参数,其对应的头文件是conioh
返回值: 函数调用成功,返回光标处x坐标值。
例: 调用这个函数的实例见18wherey()函数的例中。
18 wherey() 光标处y坐标函数
功能: 函数wherey()返回当前窗口中光标处纵向坐标。
用法: 该函数调用方式为int wherey(void);
说明: 此函数调用无参数,其相应的头文件是conioh
返回值: 函数调用成功,返回光标处y坐标值。
例: 调作函数wherex()与wherey(),返回当前光标处x坐标与y坐标,并赋给整型变量xpos ,ypos。
int xpos,ypos;
xpos=wherex();
ypos=wherey();
19 gettextinfo() 获取文本窗口信息函数
功能: 函数gettextinfo()获取当前文本窗口信息,并存放在实参结构中。
用法: 函数调用方式为void gettextinfo(struct text-info info);
说明: 函数中参数info 为struct text-info结构型指针,struct text-info结构在此函数相应的头文件中定义为:
struct text-info{
unsigned char winleft; // 窗口左上角x坐标
unsigned char wintop; // 窗口左上角y坐标
unsigned char winright; // 窗口右下角x坐标
unsigned char winbottom; // 窗口右下角y坐标
unsigned char attribute; // 文本属性
unsigned char normattr; // 正常属性
unsigned char currmode; // 当前屏显模式
unsigned char screenhight // 文本窗口高度(以行数计)
unsigned char screenwidth; // 文本窗口宽度(以字符个数计)
unsigned char curx; // 光标处x坐标
unsigned char cury; // 光标处y坐标
};
记住,调用函数gettextinfo()时,要传递struct text-info结构型指针或该结构的首地址,不要传递结构变量本身。
这个函数对应的头文件是conioh
返回值: 返回文本窗口角点坐标、高宽度、文本属性等值,并存放在info所指向的结构变量中。
例: 程序语句说明如何正确调用gettextinfo()函数:
struct text-info win-status;
gettextinfo(&win-status);
以上就是关于C# 如何截取当前程序窗口指定位置的截图全部的内容,包括:C# 如何截取当前程序窗口指定位置的截图、如何用C语言发出命令确定当前窗口、怎样用C语言获取屏幕上指定位置处的字符的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)