Système d'exploitation : Windows Server 2008 R2
Environnement de développement intégré (IDE) : Microsoft Visual Studio 2010
Langage de développement : c#
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 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 ;
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).
/// <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); }
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(); } }
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!