C#模拟PrintScreen和Alt+PrintScreen截取屏幕图片的示例代码分享(图)


本文摘自PHP中文网,作者黄舟,侵删。

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位值。
  返回值:该函数无返回值。

完整代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

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时第一次总是不能得到正确的图片,不知道是为什么!希望高手路过指点一二,小弟不胜感激!

以上就是C#模拟PrintScreen和Alt+PrintScreen截取屏幕图片的示例代码分享(图)的详细内容!

相关阅读 >>

C#实现windows剪贴板监视器的代码具体介绍

C# socket实现简单控制台案例

C#如何防止sql注入?

详细介绍data url生成工具C#版第二版的示例代码

详解介绍C#是如何获取文件md5与sha1

C#使用反射来实现对象的深度复制的示例代码分享

分享多个C#常用正则表达式的实例

通达oa 使用C#的socket编程来其替代原有操作的示例代码分享

C#中字符串的一般性和特殊性具体介绍(图文)

C#操作iis创建应用程序池出现异常:无效索引的解决方法

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...