해결 C\#현재 프로그램 창 지정 위치 캡 처 실현 방법
[ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
private static extern bool BitBlt (
IntPtr hdcDest , // DC
int nXDest ,
int nYDest ,
int nWidth ,
int nHeight ,
IntPtr hdcSrc , // DC
int nXSrc ,
int nYSrc ,
System.Int32 dwRop //
) ;
위 에 있 는 이 소 리 를 통 해 아래 코드 에서 이 함 수 를 사용 할 수 있 습 니 다.다음은 C#1 로 화면 캡 처 프로그램의 상세 한 진 은 절차 입 니 다.(1)먼저 현재 화면의 graphic 대상 을 얻 으 려 면 다음 코드 를 통 해 진 은 할 수 있 습 니 다.Graphics g1=this.CreateGraphics();(2).Bitmap 대상,10 월 엄마,그리고 그 Bitmap 대상 의 크기 는 현재 화면 입 니 다.먼저 현재 화면의 크기 를 얻 으 려 면 실제 글자 공간 인'System.Windows.Forms'의'Screen'류 의 GetWorkingArea()방식 을 통 해 이 루어 집 니 다.다음은 현재 화면의 길이(Height)와 너비(Width)를 가 져 옵 니 다.Rectangle rect=new Rectangle();rect = Screen.GetWorkingArea ( this ) ;"화면 너비"=rect.Width;"화면 길이"=rect.Height;그러면 사람들 이 원 하 는 Bitmap 를 잃 어 버 릴 수 있 습 니 다.다음 문 구 를 통 해 완성 할 수 있 습 니 다.Image MyImage=new Bitmap(rect.Width,rect.Height,g1);/화면 크기 를 기준 으로 하 는 비트 맵(3)을 만 듭 니 다.현재 화면 과 이 Bitmap 의 이미지 에 대한 DC 를 가 져 오 면 다음 문 구 를 사용 할 수 있 습 니 다.//화면 을 잃 어 버 린 DCIntPtr dc1=g1.GetHdc();/Bitmap 을 잃 어 버 린 DCIntPtr dc2=g2.GetHdc();4).API 함 수 를 호출 하여 만 든 Bitmap 에 다음 화면 을 복사 합 니 다.BitBlt(dc2,0,0,rect.Width,rect.Height,dc1,0,13369376);(5).이 앞 화면 과 그 Bitmap 의 이미지 에 대한 DC 를 풀 고,통 공 아래 코드 를 완성 할 수 있 습 니 다://화면의 DCg 1.ReleaseHdc(dc1)를 풀 수 있 습 니 다.//Bitmap 를 풀 어 준 DCg2.ReleaseHdc(dc2);6).비트 맵 을 이미지 에 보관 하여 jpg 그림 을 구성 합 니 다.MyImage.save(@"c:\\Capture.jpg",ImageFormat.Jpeg);또한 본인 의 요구 에 따라 화면 을 다른 그림 의 구조 로 보관 할 수 있 습 니 다.그림 을 비트 맵 파일 로 저장 하려 면'ImageFormat.Jpeg'을'ImageFormat.Bmp'로 바 꿀 수 있 습 니 다.그림 을 Gif 화이트 로 보관 하 는 것 을 읽 고'ImageFormat.Jpeg'을'ImageFormat.Gif'로 바 꿉 니 다.저장 할 수 있 는 파일 형식 은 약 10 여 가지 가 있 습 니 다.그곳 에 서 는 하나씩 안내 되 지 않 습 니 다.물론 보존 파일 의 접 두 사 를 상당히 바 꿔 야 합 니 다.C#1 로 화면의 스 트림 프로그램 코드(Capture.cs)를 캡 처 합 니 다.위의 이러한 절차 의 실현 방식 을 알 면 C#1 로 화면의 스 트림 프로그램 을 캡 처 할 수 있 습 니 다.다음 과 같 습 니 다.
using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
using System.Drawing.Imaging ;
public class Form1 : Form
{
private Button button1 ;
private System.ComponentModel.Container components = null ;
public Form1 ( )
{
//
InitializeComponent ( ) ;
}
//
protected override void Dispose ( bool disposing )
{
if ( disposing )
{
if ( components != null )
{
components.Dispose ( ) ;
}
}
base.Dispose ( disposing ) ;
}
private void InitializeComponent ( )
{
button1 = new Button ( );
SuspendLayout ( ) ;
button1.Location = new System.Drawing.Point ( 64 , 40 ) ;
button1.Name = "button1" ;
button1.Size = new System.Drawing.Size ( 80 , 32 ) ;
button1.TabIndex = 0 ;
button1.Text = " " ;
button1.Click += new System.EventHandler ( button1_Click ) ;
AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;
ClientSize = new System.Drawing.Size ( 216 , 125 ) ;
Controls.Add ( button1 ) ;
MaximizeBox = false ;
MinimizeBox = false ;
Name = "Form1" ;
Text = "C# !" ;
ResumeLayout ( false ) ;
}
// API
[ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
private static extern bool BitBlt (
IntPtr hdcDest , // DC
int nXDest ,
int nYDest ,
int nWidth ,
int nHeight ,
IntPtr hdcSrc , // DC
int nXSrc ,
int nYSrc ,
System.Int32 dwRop //
) ;
static void Main ( )
{
Application.Run ( new Form1 ( ) ) ;
}
private void button1_Click ( object sender , System.EventArgs e )
{
//
Rectangle rect = new Rectangle ( ) ;
rect = Screen.GetWorkingArea ( this ) ;
//
Graphics g1 = this.CreateGraphics ( ) ;
//
Image MyImage = new Bitmap ( rect.Width , rect.Height , g1 ) ;
Graphics g2 = Graphics.FromImage ( MyImage ) ;
// DC
IntPtr dc1 = g1.GetHdc ( ) ;
// Bitmap DC
IntPtr dc2 = g2.GetHdc ( ) ;
// API ,
BitBlt ( dc2 , 0 , 0 , rect.Width , rect.Height , dc1 , 0 , 0 , 13369376 ) ;
// DC
g1.ReleaseHdc ( dc1 ) ;
// Bitmap DC
g2.ReleaseHdc ( dc2 ) ;
// JPG
MyImage.Save ( @"c:\Capture.jpg" , ImageFormat.Jpeg );
MessageBox.Show ( " C capture.jpg !" ) ;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.