>  기사  >  백엔드 개발  >  C# 개발예 - 맞춤형 스크린샷 도구 (2) 프로젝트 생성, 단축키 등록, 스크린샷 메인창 표시

C# 개발예 - 맞춤형 스크린샷 도구 (2) 프로젝트 생성, 단축키 등록, 스크린샷 메인창 표시

黄舟
黄舟원래의
2017-03-14 13:19:402461검색

개발 환경

운영 체제: Windows Server 2008 R2

통합 개발 환경(IDE): Microsoft Visual Studio 2010

개발 언어: c#

프로젝트 만들기

파일》새》프로젝트


.NET Framework는 버전 2.0 또는 버전 4.0을 선택할 수 있습니다.

프로젝트 유형 선택: Windows Forms 애플리케이션

프로젝트 이름을 입력하고 확인


아래와 같이 프로젝트가 성공적으로 생성되었습니다.


기본 양식 속성

수정 테두리 없는 양식을 구현하려면 양식의 "FormBorderStyle" 속성을 "none"으로 설정하세요.


수정 후 윈도우 디자이너는 다음과 같이 표시됩니다.


다른 속성을 ​​아래와 같이 순서대로 수정하면 속성 값은 굵은 글씨 수정된


속성 설명:

ShowIcon=False, 양식의 아이콘을 표시하지 않음 ;

ShowInTaskbar=False, Windows 작업 표시줄에 양식이 표시되지 않도록

SizeGripStyle=Hide, 크기를 변경하기 위해 양식의 오른쪽 하단을 드래그하는 기능을 비활성화합니다.

WindowsState=Minimized, 시작 후 창 최소화

이러한 속성을 설정하고 컴파일하고 실행하면 프로그램은 실행 상태이지만 프로그램 창은

단축키 기능을 구현하려면

여기에서 WindowsAPI

를 사용하여 단축키를 등록해야 합니다: RegisterHotKey

함수 는 시스템 전체 핫키 를 정의합니다. 함수 프로토타입: BOOL RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk)

핫키 등록 취소: UnregisterHotKey

이 함수는 호출 스레드에서 이전에 등록한 단축키를 해제합니다.

핫키 ID 받기: GlobalAddAtom

데스크톱 애플리케이션에만 해당됩니다.

전역 원자 테이블에 문자열을 추가하고 이 문자열의 고유 식별자(원자 ATOM)를 반환합니다.

API 및 로컬 변수 정의:

        /// <summary>
        /// 向全局原子表添加一个字符串,并返回这个字符串的唯一标识符(原子ATOM)。
        /// </summary>
        /// <param name="lpString">自己设定的一个字符串</param>
        /// <returns></returns>
        [System.Runtime.InteropServices.DllImport("Kernel32.dll")]
        public static extern Int32 GlobalAddAtom(string lpString);

        /// <summary>
        /// 注册热键
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="id"></param>
        /// <param name="fsModifiers"></param>
        /// <param name="vk"></param>
        /// <returns></returns>
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk);

        /// <summary>
        /// 取消热键注册
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

        /// <summary>
        /// 热键ID
        /// </summary>
        public int hotKeyId = 100;

        /// <summary>
        /// 热键模式:0=Ctrl + Alt + A, 1=Ctrl + Shift + A
        /// </summary>
        public int HotKeyMode = 1;

        /// <summary>
        /// 控制键的类型
        /// </summary>
        public enum KeyModifiers : uint
        {
            None = 0,
            Alt = 1,
            Control = 2,
            Shift = 4,
            Windows = 8
        }

        /// <summary>
        /// 用于保存截取的整个屏幕的图片
        /// </summary>
        protected Bitmap screenImage;

등록 단축키:

        private void Form1_Load(object sender, EventArgs e)
        {
            //隐藏窗口
            this.Hide();

            //注册快捷键
            //注:HotKeyId的合法取之范围是0x0000到0xBFFF之间,GlobalAddAtom函数得到的值在0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。
            this.hotKeyId = GlobalAddAtom("Screenshot") - 0xC000;
            if (this.hotKeyId == 0)
            {
                //如果获取失败,设定一个默认值;
                this.hotKeyId = 0xBFFE; 
            }

            if (this.HotKeyMode == 0)
            {
                RegisterHotKey(Handle, hotKeyId, (uint)KeyModifiers.Control | (uint)KeyModifiers.Alt, Keys.A);
            }
            else
            {
                RegisterHotKey(Handle, hotKeyId, (uint)KeyModifiers.Control | (uint)KeyModifiers.Shift, Keys.A);
            }
        }

핫키 응답 기능:

        /// <summary>
        /// 处理快捷键事件
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
            //if (m.Msg == 0x0014)
            //{
            //    return; // 禁掉清除背景消息
            //}
            const int WM_HOTKEY = 0x0312;
            switch (m.Msg)
            {
                case WM_HOTKEY:
                    ShowForm();
                    break;
                default:
                    break;
            }
            base.WndProc(ref m);
        }

스크린샷 창 구현 원칙

스크린샷 창은 실제로 테두리, 메뉴, 도구 모음이 없는 전체 화면 최상위 창입니다.

단축키를 누르면 프로그램은 먼저 전체 화면의 그림을 가져와 "screenImage" 변수에 저장한 다음 마스크 레이어를 추가하고 이를 양식의 배경 이미지로 설정한 다음 메인 화면과 디스플레이 창의 크기가 바탕화면에 반투명 마스크 레이어를 추가한 듯한 느낌을 줍니다.

코드는 다음과 같습니다.

        /// <summary>
        /// 如果窗口为可见状态,则隐藏窗口;
        /// 否则则显示窗口
        /// </summary>
        protected void ShowForm()
        {
            if (this.Visible)
            {
                this.Hide();
            }
            else
            {
                Bitmap bkImage = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
                Graphics g = Graphics.FromImage(bkImage);
                g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size, CopyPixelOperation.SourceCopy);
                screenImage = (Bitmap)bkImage.Clone();
                g.FillRectangle(new SolidBrush(Color.FromArgb(64, Color.Gray)), Screen.PrimaryScreen.Bounds);
                this.BackgroundImage = bkImage;

                this.ShowInTaskbar = false;
                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                this.Width = Screen.PrimaryScreen.Bounds.Width;
                this.Height = Screen.PrimaryScreen.Bounds.Height;
                this.Location = Screen.PrimaryScreen.Bounds.Location;

                this.WindowState = FormWindowState.Maximized;
                this.Show();
            }
        }

단축키 등록 취소

창을 닫을 때 단축키 등록을 취소하는 코드는 다음과 같습니다.

        /// <summary>
        /// 当窗口正在关闭时进行验证
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (e.CloseReason == CloseReason.ApplicationExitCall)
            {
                e.Cancel = false;
                UnregisterHotKey(this.Handle, hotKeyId);
            }
            else
            {
                this.Hide();
                e.Cancel = true;
            }
        }

여기서 키 등록, 스크린샷 창 표시 등 단축키 기능이 기본적으로 완료되었습니다.

참고: 이 코드를 테스트할 때 스크린샷 창을 닫거나 숨기려면 양식에 버튼 을 추가하는 것이 가장 좋습니다. 스크린샷 창이 전체 화면이고 응답할 수 없기 때문입니다. ESC 키를 사용하면 작업 관리자 종료를 통해서만 프로세스를 종료할 수 있습니다. 디버깅할 때 필요한 변수 정보를 표시하려면 양식에 레이블컨트롤을 추가하는 것이 가장 좋습니다. 스크린샷 창은 최상위 전체 화면 창이고 아무 것도 없기 때문입니다. 중단점에 도달했을 때 이를 작동하는 방법.

위 내용은 C# 개발예 - 맞춤형 스크린샷 도구 (2) 프로젝트 생성, 단축키 등록, 스크린샷 메인창 표시의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.