C# Simulate PrintScreen and Alt+PrintScreen to capture screen pictures
Function: This function synthesizes a keystroke event. The system can use this synthesized keystroke event to generate a WM_KEYUP or WM_KEYDOWN message, and the interrupt handler of the keyboard driver program calls the keybd_event function. In Windows NT this function has been replaced by SendInput.
Function prototype; VOID keybd_event (BYTE bVk, BYTE bScan, DWORD dwFlags, DWORD dwExtralnfo);
Parameters:
bVk: Define a Virtual key code. The key code value must be between 1 and 254.
bScan: Define the hardware scan code of this key.
dwFlags:A set of flags that defines various aspects of the function's operation. The application can set the flag bits using a combination of some predefined constants as follows.
KEYEVENTF_EXTENDEDKEY: If this value is specified, the previous value of the scan code is the prefix byte of OXEO (224).
KEYEVENTF_KEYUP: If this value is specified, the key will be released; if this value is not specified, the key will be pressed.
dwExtralnfo: Defines additional 32-bit values related to keystrokes.
Return value: This function has no return value.
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(); } } }
No task issues with PrintScreen, but when using AltPrintScreen for the first time I can't always get the correct picture, I don't know why! I hope an expert can pass by and give me some advice. I’d be very grateful!
The above is the detailed content of C# sample code sharing for simulating PrintScreen and Alt+PrintScreen to capture screen pictures (picture). For more information, please follow other related articles on the PHP Chinese website!