Maison  >  Article  >  développement back-end  >  Exemple de partage de code C# pour simuler PrintScreen et Alt PrintScreen pour capturer des images d'écran (image)

Exemple de partage de code C# pour simuler PrintScreen et Alt PrintScreen pour capturer des images d'écran (image)

黄舟
黄舟original
2017-03-13 17:49:052509parcourir

C# Simulez PrintScreen et Alt PrintScreen pour capturer des images d'écran

keybd_event API

Fonction Fonction : Cette fonction synthétise un événement de frappe. Le système peut utiliser cet événement de frappe synthétisé pour générer un message WM_KEYUP ou WM_KEYDOWN, et le gestionnaire d'interruption du programme pilote du clavier appelle la fonction keybd_event. Sous Windows NT, cette fonction a été remplacée par SendInput.

Prototype de fonction ; VOID keybd_event (BYTE bVk, BYTE bScan, DWORD dwFlags, DWORD dwExtralnfo

Paramètres :

bVk : définir un Code clé virtuelle. La valeur du code clé doit être comprise entre 1 et 254.
bScan : Définit le code de scan matériel de cette clé.
 dwFlags :Un ensemble de drapeaux qui définissent divers aspects du fonctionnement de la fonction . Les applications peuvent définir des bits d'indicateur en utilisant une combinaison de certaines constantes prédéfinies comme suit.
KEYEVENTF_EXTENDEDKEY : Si cette valeur est spécifiée, la valeur précédente du scan code est l'octet de préfixe d'OXEO (224).
KEYEVENTF_KEYUP : Si cette valeur est spécifiée, la touche sera relâchée ; si cette valeur n'est pas spécifiée, la touche sera enfoncée.
dwExtralnfo : définit des valeurs 32 bits supplémentaires liées aux frappes au clavier.
Valeur de retour : Cette fonction n'a pas de valeur de retour.

Code complet :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace PrintScreen
{
    public partial class Form1 : Form
    {

        [DllImport("user32.dll")]
        static extern void keybd_event
        (
            byte bVk,// 虚拟键值  
            byte bScan,// 硬件扫描码  
            uint dwFlags,// 动作标识  
            IntPtr dwExtraInfo// 与键盘动作关联的辅加信息  
        );

        /// <summary>
        /// 模拟Print Screen键盘消息,截取全屏图片。
        /// </summary>
        public void PrintScreen()
        {
            keybd_event((byte)0x2c, 0, 0x0, IntPtr.Zero);//down
            Application.DoEvents(); 
            keybd_event((byte)0x2c, 0, 0x2, IntPtr.Zero);//up
            Application.DoEvents(); 
        }

        /// <summary>
        /// 模拟Alt Print Screen键盘消息,截取当前窗口图片。
        /// </summary>
        public void AltPrintScreen()
        {
            keybd_event((byte)Keys.Menu, 0, 0x0, IntPtr.Zero);
            keybd_event((byte)0x2c, 0, 0x0, IntPtr.Zero);//down
            Application.DoEvents();
            Application.DoEvents();
            keybd_event((byte)0x2c, 0, 0x2, IntPtr.Zero);//up
            keybd_event((byte)Keys.Menu, 0, 0x2, IntPtr.Zero);
            Application.DoEvents();
            Application.DoEvents();
        } 

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// 从剪贴板获取图片
        /// </summary>
        /// <returns></returns>
        private Bitmap GetScreenImage()
        {
            IDataObject newobject = null;
            Bitmap NewBitmap = null;

            try
            {
                Application.DoEvents();
                newobject = Clipboard.GetDataObject();

                if (Clipboard.ContainsImage())
                {
                    NewBitmap = (Bitmap)(Clipboard.GetImage().Clone());
                }

                return NewBitmap;
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            pictureBox1.Image = null;
            PrintScreen();
            pictureBox1.Image = GetScreenImage();
            button1.Enabled = true;
            Application.DoEvents();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            button2.Enabled = false;
            pictureBox1.Image = null;
            AltPrintScreen();
            pictureBox1.Image = GetScreenImage();
            button2.Enabled = true;
            Application.DoEvents();
        }

    }
}

Effet de course :


Problèmes hérités :

PrintScreen n'a aucun problème de tâche, mais lors de l'utilisation d'AltPrintScreen Je n'arrive toujours pas à obtenir la bonne image, je ne sais pas pourquoi ! J'espère qu'un expert pourra passer par là et me donner quelques conseils, je lui serais très reconnaissant !

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