>  기사  >  백엔드 개발  >  화면 그림(그림)을 캡처하기 위해 PrintScreen 및 Alt+PrintScreen을 시뮬레이션하기 위한 C# 샘플 코드 공유

화면 그림(그림)을 캡처하기 위해 PrintScreen 및 Alt+PrintScreen을 시뮬레이션하기 위한 C# 샘플 코드 공유

黄舟
黄舟원래의
2017-03-13 17:49:052414검색

C# PrintScreen 및 Alt+PrintScreen을 시뮬레이션하여 화면 사진 캡처

keybd_event API

함수: 이 함수는 키 입력 이벤트를 합성합니다. 시스템은 이 합성된 키 입력 이벤트를 사용하여 WM_KEYUP 또는 WM_KEYDOWN 메시지를 생성할 수 있으며 키보드 드라이버 프로그램의 인터럽트 핸들러는 keybd_event 함수를 호출합니다. Windows NT에서는 이 함수가 SendInput으로 대체되었습니다.

함수 프로토타입; VOID keybd_event(BYTE bVk, BYTE bScan, DWORD dwFlags, DWORD dwExtralnfo)

매개변수:

bVk: 가상 키 코드. 키 코드 값은 1에서 254 사이여야 합니다.
bScan: 이 키의 하드웨어 스캔 코드를 정의합니다.
 dwFlags:함수 작동의 다양한 측면을 정의하는 플래그 집합입니다. 애플리케이션은 다음과 같이 미리 정의된 일부 상수의 조합을 사용하여 플래그 비트를 설정할 수 있습니다.
KEYEVENTF_EXTENDEDKEY: 이 값을 지정하면 스캔 코드의 이전 값은 OXEO의 접두사 바이트(224)입니다.
KEYEVENTF_KEYUP: 이 값을 지정하면 키가 해제되고, 이 값을 지정하지 않으면 키가 눌러집니다.
dwExtralnfo: 키 입력과 관련된 추가 32비트 값을 정의합니다.
반환 값: 이 함수에는 반환 값이 없습니다.

전체 코드:

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에는 작업 문제가 없지만 AltPrintScreen을 사용하는 경우 처음에는 항상 올바른 사진을 얻을 수 없는데 왜 그런지 모르겠습니다! 전문가가 지나가셔서 조언을 해주시면 정말 감사하겠습니다!

위 내용은 화면 그림(그림)을 캡처하기 위해 PrintScreen 및 Alt+PrintScreen을 시뮬레이션하기 위한 C# 샘플 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.