C\#자신 만 의 QQ 캡 처 도구 구현

10227 단어 C#캡 처
본 논문 의 사례 는 C\#QQ 캡 처 도 구 를 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
캡 처 도 구 를 실현 하 는 실현 방향 을 구체 적 으로 소개 한다.
여러분 이 자신의 캡 처 도 구 를 어떻게 실현 하 는 지 더 잘 알 수 있 도록 먼저 제 가 캡 처 하 는 과정 을 설명 하 겠 습 니 다.QQ 의 캡 처 도구 와 윈도 우즈 가 가지 고 있 는 캡 처 도 구 를 사용 하면 QQ 창의 캡 처 단 추 를 눌 렀 을 때 저 희 는 전체 화면 사진 을 볼 수 있 습 니 다.그리고 저 희 는 그 위 에서 캡 처 할 수 있 습 니 다.마우스 왼쪽 단 추 를 눌 렀 을 때...즉,캡 처 를 시작 하고 마 우 스 를 움 직 여 캡 처 의 크기 를 바 꿀 수 있 습 니 다.마우스 가 켜 지면 캡 처 를 끝 냅 니 다.이때 사각형 영역 을 두 번 눌 러 서 완전히 캡 처 할 수 있 습 니 다.또한 캡 처 작업 을 통 해 캡 처 한 그림 을 채 팅 창의 전송 구역 에 붙 일 수 있 습 니 다.마우스 오른쪽 단 추 를 누 르 면 캡 처 를 종료 합 니 다.이렇게 해서 우리 가 캡 처 하 는 과정 에 대한 묘 사 는 바로 이런 것 이다.이 묘사 에서 우 리 는 우리 의 캡 처 도 구 를 실현 하 는 방향 을 추상 화 할 수 있다.
'이때 우 리 는 전체 화면 사진 을 볼 것 이다'라 는 말 에서 우 리 는 추상 적 으로 QQ 캡 처 도구 의 실현 에 있어 우리 가 본 이 전체 화면 사진 은'그림'이 아니 라 하나의 창 이 라 고 묘사 해 야 한다.이 창 은 우리 가'캡 처 창'이 라 고 명명 했다.다만 창의 배경 그림 을 전체 화면 그림 으로 설정 합 니 다.여기까지 말 하 자 QQ 캡 처 도 구 를 연구 하지 않 은 일부 사람들 이 의문 을 가지 기 시작 했다.우리 가 본 것 은 창문 인가?그런데 왜 테두리 의,즉 최대 화 단추 가 없고,최 하위 화 단추 가 없 습 니까?이 점 에 대한 설명 은 프로그램 에서 Form 의 Borderstyle 속성 을 none 으로 설정 하여 테 두 리 를 숨 길 수 있다 는 것 이다.
창의 배경 그림 을 전체 화면 그림 으로 설정 하려 면 배경 그림 을 설정 하려 면 창의 BackgroundImage 속성 만 설정 하면 된다 는 것 을 알 고 있 습 니 다.하지만 전체 화면 그림 은 어떻게 얻 습 니까?전체 화면 사진 이 니 당연히 나 는 창 을 최대 화 시 켜 야 한다.그렇지 않 으 면 우 리 는 전체 화면 이 아 닌 테두리 가 없 는'작은 그림'을 볼 수 있다.다음은 이 분석 을 구체 적 으로 실현 하 는 코드 입 니 다.           

//   Graphics CopyFromScreen                                ,
 //       ,CatchBmp          ,                。
 //               
 Bitmap CatchBmp = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
 
 //       ,           
 //                   
 //       Graphics             
 Graphics g = Graphics.FromImage(CatchBmp);

 //                   CatchBmp 
 g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height));

 //       
 cutter = new Cutter();

 //               
 cutter.BackgroundImage = CatchBmp;
3.'그리고 우 리 는 그 위 에서 캡 처 할 수 있다'는 말 에서 우 리 는 추상 적 으로'사실 우 리 는 캡 처 작업 을 한다.절차 적 인 측면 에서 볼 때 우리 가 이 최대 화 된 창문 에서 그림 을 그 리 는 것 이다.GDI+그림 을 모 르 는 친구 들 에 게 이해 하기 어 려 울 수도 있다.여기 서 비 유 를 한다.우 리 는 펜 으로 종이 에 그림 을 그 릴 것 이다.우 리 는 삼각형 을 비교 할 수 있다.사각형 은 이미 여러 가지 도형 이 있 는데 이때 종 이 는 바로 우리 의 화판 이다.펜 은 그림 을 그 리 는 데 쓰 이 는 동시에 펜 도 색깔 과 굵기 가 있다.우 리 는 빨간색 수필 로 그 릴 수 있다.그 려 진 그림 은 빨간색 이 고 검은색 수필 로 그 릴 수 있다.자 연 스 럽 게 그 려 진 것 은 검은색 이다.마찬가지 로GDI+,즉 Graphics Device Interface Plus,즉 그래 픽 장치 인터페이스 에서.NET 에서 도 이러한 유형 을 제공 하여 이미지 에 대한 접근 을 실현 할 수 있 습 니 다.즉,우 리 는.NET 에서 제공 하 는 유형 으로'그림 그리 기'를 할 수 있 습 니 다.그림 을 그 리 려 면 당연히 그림 판 이 있어 야 합 니 다..NET 류 에서 Graphics 류 는 화판 에 대한 추상 적 인 것 으로 화판 은 세 가지 방식 으로 만 들 수 있다.(1)그림 이나 계승 이미지 대상 에서 만 들 수 있다.(2)창 이나 컨트롤 의 Paint 이벤트 에서 만 듭 니 다.(3)창 이나 컨트롤 을 이용 한 Create Graphics 방법 으로 만 듭 니 다.화판 이 있 으 면 당연히 펜 으로 그림 을 그 려 야 한다..NET 에서 Pen 류 는 펜 의 역할 을 한다.구조 함수 에서 펜 의 색깔 과 굵기 를 지정 할 수 있 고 펜 이 있 으 면 그림 을 그리 기 시작한다..NET 에서 도 마찬가지 로 그림 을 그 리 는 방법 을 제공 했다.예 를 들 어 Draw Rectangle 방법-사각형 그리 기
4.마우스 왼쪽 단 추 를 눌 렀 을 때 캡 처 를 시작 하 는 것 을 의미 하 며 마 우 스 를 움 직 여 캡 처 의 크기 를 바 꿀 수 있 습 니 다.마우스 가 켜 졌 을 때 캡 처 를 끝 내 는 것 을 의미 합 니 다.이때 사각형 영역 을 두 번 눌 러 서 완전히 캡 처 할 수 있 고 붙 여 넣 기 동작 을 통 해 캡 처 한 그림 을 채 팅 창의 전송 구역 에 붙 일 수 있 습 니 다.마우스 오른쪽 단 추 를 누 르 면 캡 처 를 종료 합 니 다.마우스 업(마우스 팝 업 종료 캡 처 에 대응)과 마우스 더 블 클릭(마우스 더 블 클릭 으로 사각형 영역 을 완전히 캡 처 하고 붙 여 넣 기 동작 을 통 해 캡 처 한 그림 을 채 팅 창의 전송 영역 에 붙 일 수 있 습 니 다.붙 여 넣 기 동작 을 통 해 캡 처 그림 을 얻 을 수 있 으 므 로 이 이벤트 에서 캡 처 그림 을 설정 해 야 합 니 다).3 과 4 의 분석 과정 도 캡 처 기능 의 핵심 실현 으로 아래 의 코드(코드 에 상세 한 설명 이 있 고 여러분 이 이해 할 때 3 과 4 의 분석 을 결합 할 수 있 습 니 다)에 대응 합 니 다.

 /// <summary>
 ///           
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Cutter_MouseClick(object sender, MouseEventArgs e)
 {
 if (e.Button == MouseButtons.Right)
 {
 this.DialogResult = DialogResult.OK;
 this.Close();
 }
 }

 /// <summary>
 ///           
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Cutter_MouseDown(object sender, MouseEventArgs e)
 {
 //            ,     
 if (e.Button == MouseButtons.Left)
 {
 //         
 if (!CatchStart)
 { 
 CatchStart = true;
 //           
 DownPoint = new Point(e.X, e.Y);
 }
 }
 }

 /// <summary>
 ///           ,            
 ///               ,       
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Cutter_MouseMove(object sender, MouseEventArgs e)
 {
 //       
 if (CatchStart)
 {
 //         ,         
 Bitmap copyBmp = (Bitmap)originBmp.Clone();

 //          
 Point newPoint = new Point(DownPoint.X, DownPoint.Y);

 //        
 Graphics g = Graphics.FromImage(copyBmp);
 Pen p = new Pen(Color.Red, 1);

 //        
 int width = Math.Abs(e.X - DownPoint.X);
 int height = Math.Abs(e.Y-DownPoint.Y);
 if (e.X < DownPoint.X)
 {
 newPoint.X = e.X;
 }
 if (e.Y < DownPoint.Y)
 {
 newPoint.Y = e.Y;
 }

 CatchRectangle = new Rectangle(newPoint, new Size(width,height));
 
 //         
 g.DrawRectangle(p, CatchRectangle);

 //        
 g.Dispose();
 p.Dispose();
 //            
 Graphics g1 = this.CreateGraphics();
 
 //                
 //               ?
 //               ,               
 //              
 g1.DrawImage(copyBmp, new Point(0, 0));
 g1.Dispose();
 //       ,         
 copyBmp.Dispose();
 }
 }

 /// <summary>
 ///         
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Cutter_MouseUp(object sender, MouseEventArgs e)
 {
 if (e.Button == MouseButtons.Left)
 {
 //         ,            
 if (CatchStart)
 {
 CatchStart = false;
 CatchFinished = true;
 }
 }
 }

 /// <summary>
 ///       ,         ,               
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Cutter_MouseDoubleClick(object sender, MouseEventArgs e)
 {
 if (e.Button == MouseButtons.Left && CatchFinished)
 {
 //                 
 Bitmap CatchedBmp = new Bitmap(CatchRectangle.Width, CatchRectangle.Height);

 Graphics g = Graphics.FromImage(CatchedBmp);

 //  originBmp                  
 // CatchRectangle  originBmp     
 //                     
 //    CatchedBmp        ,               
 g.DrawImage(originBmp, new Rectangle(0, 0, CatchRectangle.Width, CatchRectangle.Height), CatchRectangle, GraphicsUnit.Pixel);

 //           
 Clipboard.SetImage(CatchedBmp);
 g.Dispose();
 CatchFinished = false;
 this.BackgroundImage = originBmp;
 CatchedBmp.Dispose();
 this.DialogResult = DialogResult.OK;
 this.Close();
 }
 }
5.4 시 까지 캡 처 기능 을 분 석 했 습 니 다.그 다음 에 QQ 캡 처 를 사용 할 때 저 희 는 채 팅 창 에 있 는 캡 처 버튼 을 눌 러 캡 처 할 수 있 는 것 외 에 Alt+Ctrl+A 를 눌 러 캡 처 할 수 있 습 니 다.이 기능 을 실현 하려 는 사고방식 도 간단 하 다.즉,채 팅 창 을 불 러 올 때 단축 키(프로그램 에서 내 가 정의 하 는 단축 키 는'Alt+Ctrl+C')를 등록 하 는 것 이다.(이때 Win 32 에서 RegisterHotKey 방법 으로 단축 키 등록 을 완성 했다)채 팅 창 이 닫 혔 을 때 단축 키 를 마 운 트 해제 하여 단축 키 에 여러 번 등록 하 는 것 을 방지한다.이때 Win 32 의 UnregisterHotKey 방법 을 호출 하여 완성 합 니 다.구체 적 인 실현 코드 는 다음 과 같 습 니 다.

 /// <summary>
 ///         
 ///           
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void     _Load(object sender, EventArgs e)
 {
 uint ctrlHotKey = (uint)(KeyModifiers.Alt|KeyModifiers.Ctrl);
 //      Alt+Ctrl+C, "100"       
 HotKey.RegisterHotKey(Handle, 100, ctrlHotKey, Keys.C);
 }

 /// <summary>
 ///          
 ///            
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void     _FormClosing(object sender, FormClosingEventArgs e)
 {
 //     
 HotKey.UnregisterHotKey(Handle, 100);
 }

 #endregion

 //          
 private void GlobalKeyProcess()
 {
 this.WindowState = FormWindowState.Minimized;
 //             
 Thread.Sleep(200);
 btnCutter.PerformClick();
 }

 /// <summary>
 ///   WndProc()  ,        ,     
 ///   Windows  
 /// </summary>
 /// <param name="m"></param>
 protected override void WndProc(ref Message m)
 {
 //  m.Msg   0x0312           
 const int WM_HOTKEY = 0x0312;
 switch (m.Msg)
 {
 case WM_HOTKEY:
 if (m.WParam.ToString() == "100")
 {
 GlobalKeyProcess();
 }

 break;
 }

 //            WndProc
 base.WndProc(ref m); 
 }
실현 효과
위 에서 이미 QQ 캡 처 를 실현 하 는 사고방식 을 소 개 했 는데,여러분 은 이 프로그램의 효과 하 나 를 보고 싶 어 하지 않 습 니까?다음은 하나의 애니메이션 을 통 해 프로그램의 실행 효 과 를 더욱 구체 적 으로 볼 수 있 습 니 다.

QQ 캡 처 도구 다운로드:다운로드 주소
총결산
여기 서 QQ 캡 처 의 소개 부분 은 여기까지 입 니 다.이 도구 의 실현 은 자신 이 설명 하 는 것 이 매우 통속 적 이 고 이해 하기 쉽다 고 생각 합 니 다.여러분 들 은 이렇게 생각 하고 QQ 캡 처 의 실현 방향 을 더욱 명확 하 게 이해 할 수 있 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기