C# Simulez PrintScreen et Alt PrintScreen pour capturer des images d'écran
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.
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(); } } }
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!