C# 如何截取当前程序窗口指定位置的截图

C# 如何截取当前程序窗口指定位置的截图,第1张

编程思路(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语言获取屏幕上指定位置处的字符的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9777376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存