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 캡 처 의 실현 방향 을 더욱 명확 하 게 이해 할 수 있 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.