해결 C\#현재 프로그램 창 지정 위치 캡 처 실현 방법

6186 단어 C#현재 창 캡 처
이 기능 을 완성 하려 면 먼저 C#1 에서 API(프로그램 을 이용 하여)함 수 를 어떻게 호출 하 는 지 알 아야 한다.물론.Net 프레임 워 크 에서 많은 라 이브 러 리,400 전 화 를 구 했 습 니 다.이런 라 이브 러 리 의 효과 도 매우 강하 지만 일부 Windows 최상 위 프로 그래 밍 에 대해 서 는 이러한 API 함 수 를 호출 해 야 실현 할 수 있 습 니 다.모든 API 는'Kernel','User'와'GDI'세 개의 라 이브 러 리 에서 작 동 할 수 있 습 니 다.그 중에서'Kernel',그의 라 이브 러 리 이름 은'KERNEL32.DLL'입 니 다.그 는 시스템 간 의 관계 가 발생 하 는 데 중요 합 니 다.예 를 들 어 프로그램 로드,컨 텍스트 선택,파일 전송,메모리 관리 등 입 니 다."User 라 이브 러 리 는 Win 32 에서'USER 32.DLL'이 라 고 명명 되 었 다.그것 은 전체 사용 자 를 다스 리 는 것 을 허용 한다.예 를 들 어 창문,요리 쌍,대화 상자,그림 등 이다."GDI"(이미지 장비 인터페이스)는 Win 32 의 라 이브 러 리 에 있 습 니 다."GDi32.dll"입 니 다.그래 픽 출력 라 이브 러 리 입 니 다.GDI 윈도 우 를 사용 하여 창 심,메뉴 쌍,대화 상자 등 을 그립 니 다.그것 은 도형 출력 을 만 들 수 있다.그것 도 도형 파일 을 저장 할 수 있다.원문 이 건 드 린 것 은 이미지 퀴즈 이기 때문에 모든 호출 된 라 이브 러 리 는'GDi32.dll'이다.원문 프로그램 에서 사람들 이 사용 하 는 API 함 수 는'BitBlt'입 니 다.이 함 수 는 넓 은 프로그래머 에 대해 서 는 생소 함 을 느끼 지 못 할 것 입 니 다.이미지 처리 에 있어 서 그의 용 도 는 절대적 으로 좁 기 때문에 다른 프로그램 언어 로 프로 그래 밍 할 때 도 자주 그 와 이 야 기 를 해 야 합 니 다..Net FrameWork SDK 에'System.Runtime.InteropServices'라 는 실제 글자 공간 이 있 습 니 다.이 이름 공간 은 COM 대상 을 방문 하고 외지 의 API 함 수 를 호출 하 는 일련의 클래스 를 내 렸 습 니 다.다음은 C#1 에서 이 함 수 를 밝 히 고 있 습 니 다.

[ 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 !" ) ;
}
}

좋은 웹페이지 즐겨찾기