Maison  >  Article  >  développement back-end  >  Exemple de développement C# - Outil de capture d'écran personnalisé (2) Créer un projet, enregistrer des raccourcis clavier et afficher la fenêtre principale de capture d'écran

Exemple de développement C# - Outil de capture d'écran personnalisé (2) Créer un projet, enregistrer des raccourcis clavier et afficher la fenêtre principale de capture d'écran

黄舟
黄舟original
2017-03-14 13:19:402544parcourir

Environnement de développement

Système d'exploitation : Windows Server 2008 R2

Environnement de développement intégré (IDE) : Microsoft Visual Studio 2010

Langage de développement : c#

Créer un projet

Fichier》Nouveau》Projet


.NET Framework peut choisir la version 2.0 ou la version 4.0 ;

Sélection du type de projet : application Windows Forms

Entrez le nom du projet et confirmez


Le projet a été créé avec succès, comme indiqué ci-dessous :


Modifier le formulaire principal attributs

Modifier la propriété "FormBorderStyle" du formulaire à "aucun" pour implémenter un formulaire sans bordure


Après modification, le concepteur de fenêtres affiche comme suit :


Modifier les autres attributs dans l'ordre comme indiqué ci-dessous, les valeurs d'attribut sont dans gras Il s'agit d'une


Description de l'attribut modifiée :

ShowIcon=False, ne pas afficher l'icône du formulaire ;

ShowInTaskbar=False, pour que le formulaire n'apparaisse pas dans la barre des tâches Windows

SizeGripStyle=Hide, désactivez la fonction de glisser le coin inférieur droit du formulaire pour modifier la taille ;

WindowsState=Minimized , minimisez la fenêtre après le démarrage ;

Après avoir défini ces propriétés, compilez et exécutez, le programme est dans l'état en cours d'exécution, mais la fenêtre du programme ne peut pas être vu ;

Pour implémenter la fonction de raccourci clavier

ici, vous devez utiliser WindowsAPI

pour enregistrer le raccourci clavier : RegisterHotKey

LaFonction définit un touche de raccourci à l'échelle du système. Fonction Prototype : BOOL RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk

Annuler l'enregistrement du raccourci : UnregisterHotKey

Cette fonction libère le raccourci clavier précédemment enregistré par le thread appelant.

Obtenir l'ID de raccourci clavier : GlobalAddAtom

Uniquement pour les applications de bureau.

Ajoute une chaîne à la table globale des atomes et renvoie l'identifiant unique de cette chaîne (l'atome ATOM).

API et variables locales définition :

        /// <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;

Touche de raccourci d'enregistrement :

        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);
            }
        }

Fonction de réponse de raccourci :

        /// <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);
        }

Principe de mise en œuvre de la fenêtre de capture d'écran

La fenêtre de capture d'écran est en fait une fenêtre de niveau supérieur plein écran sans bordures, sans menus et sans barres d'outils.

Lorsque la touche de raccourci est enfoncée, le programme obtient d'abord une image de tout l'écran et l'enregistre dans la variable "screenImage" ; puis ajoute un calque de masque, le définit comme image d'arrière-plan du formulaire et définit la taille de la fenêtre La taille de l'écran principal et de la fenêtre d'affichage donne l'impression d'ajouter un calque de masque translucide au bureau.

Le code est le suivant :

        /// <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();
            }
        }

Annuler l'enregistrement du raccourci clavier

Lors de la fermeture de la fenêtre, pour annuler l'enregistrement du raccourci clavier, le code est le suivant :

        /// <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;
            }
        }

À ce stade, l'enregistrement des raccourcis clavier, l'affichage de la fenêtre de capture d'écran et d'autres fonctions sont pratiquement terminés.

Remarque : lors du test de ce code, il est préférable d'ajouter un bouton au formulaire pour fermer ou masquer la fenêtre de capture d'écran car la fenêtre de capture d'écran est en plein écran et ne peut pas répondre ; à la touche ESC, le processus ne peut donc être terminé que via le gestionnaire de tâches sortie. Lors du débogage, il est préférable d'ajouter un Labelcontrôle au formulaire pour afficher les informations variables requises, car la fenêtre de capture d'écran est une fenêtre plein écran de niveau supérieur, et il y a aucun moyen de le faire fonctionner lorsque le point d'arrêt est atteint VS.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn