有了之前的基础知识了解,现在开始实现PrtScn和Alt+PrtScn。

首先新建一个WPF应用程序,命名为PrintscreenAndAltPrintScreen

导入keybd_event方法
需要为DllImport添加using System.Runtime.InteropServices;

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

编写PrtScn函数:

public void PrintScreen()
{keybd_event((byte)0x2c, 0, 0x0, IntPtr.Zero);//downSystem.Windows.Forms.Application.DoEvents(); //添加引用system.windows.formskeybd_event((byte)0x2c, 0, 0x2, IntPtr.Zero);//upSystem.Windows.Forms.Application.DoEvents();
}

编写Alt+PrtScn函数:

public void AltPrintScreen()
{keybd_event((byte)Keys.Menu, 0, 0x0, IntPtr.Zero);keybd_event((byte)0x2c, 0, 0x0, IntPtr.Zero);//downSystem.Windows.Forms.Application.DoEvents();System.Windows.Forms.Application.DoEvents();keybd_event((byte)0x2c, 0, 0x2, IntPtr.Zero);//upkeybd_event((byte)Keys.Menu, 0, 0x2, IntPtr.Zero);System.Windows.Forms.Application.DoEvents();System.Windows.Forms.Application.DoEvents();
}

编写从剪贴板获得图片函数:
需要添加using System.Drawing;添加引用System.Drawing

private Bitmap GetScreenImage()
{System.Windows.Forms.IDataObject newobject = null;Bitmap NewBitmap = null;try{System.Windows.Forms.Application.DoEvents();newobject = System.Windows.Forms.Clipboard.GetDataObject();if (System.Windows.Forms.Clipboard.ContainsImage()){NewBitmap = (Bitmap)(System.Windows.Forms.Clipboard.GetImage().Clone());}return NewBitmap;}catch(Exception ex){Console.WriteLine(ex.Message);return null;}
}

编写xmal程序:
简单添加两个Image控件和两个button按钮

 <Window x:Class="PrintscreenAndAltPrintScreen.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="768" Width="1024"><Grid> <Image Name="image1" Margin="45,30,562,203"> </Image> <Button Content="PrtScn" Height="24" HorizontalAlignment="Left" Margin="182,552,0,0" Name="button1" VerticalAlignment="Top" Width="95" Click="button1_Click" /> <Button Content="Alt+PrtScn" Height="24" HorizontalAlignment="Left" Margin="718,552,0,0" Name="button2" VerticalAlignment="Top" Width="95" Click="button2_Click" /> <Image Margin="566,30,41,213" Name="image2" /> </Grid> </Window>

对两个按钮添加click事件:
这里需要把Bitmap转为BitmapSource,可以参阅博客:WPF(C#)中Bitmap与BitmapImage相互转换

private void button2_Click(object sender, RoutedEventArgs e)
{image2.Source = null;AltPrintScreen();Bitmap bitmap = GetScreenImage();IntPtr ip = bitmap.GetHbitmap();//从GDI+ Bitmap创建GDI位图对象
//Imaging.CreateBitmapSourceFromHBitmap方法,基于所提供的非托管位图和调色板信息的指针,返回一个托管的BitmapSourceBitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());image2.Source = bitmapSource;
}
private void button1_Click(object sender, RoutedEventArgs e)
{image1.Source = null;PrintScreen();Bitmap bitmap = GetScreenImage();IntPtr ip = bitmap.GetHbitmap();//从GDI+ Bitmap创建GDI位图对象
//Imaging.CreateBitmapSourceFromHBitmap方法//基于所提供的非托管位图和调色板信息的指针,返回一个托管的BitmapSourceBitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());image1.Source = bitmapSource;
}

最后对DoEvents 方法的一点解释:
Application.DoEvents 方法
处理当前在消息队列中的所有 Windows 消息。
语法:

public static void DoEvents()

当运行 Windows 窗体时,它将创建新窗体,然后该窗体等待处理事件。该窗体在每次处理事件时,均将处理与该事件关联的所有代码。所有其他事件在队列中等待。当代码处理事件时,应用程序不会响应。例如,如果将甲窗口拖到乙窗口之上,则乙窗口不会重新绘制。
如果在代码中调用 DoEvents,则您的应用程序可以处理其他事件。 例如,如果您有向 ListBox 添加数据的窗体,并将 DoEvents 添加到代码中,那么当将另一窗口拖到您的窗体上时,该窗体将重新绘制。 如果从代码中移除 DoEvents,那么在按钮的单击事件处理程序执行结束以前,您的窗体不会重新绘制。
与 Visual Basic 6.0 不同, DoEvents 方法不调用 Thread.Sleep 方法。

最后发图不发种:

C#模拟PrtScn实现截屏相关推荐

  1. C#模拟PrtScn实现截屏预备知识--keybd_event使用方法

    Windows提供了一个模拟键盘API函数Keybd_event(),使用该函数可以相应的屏蔽键盘的动作.Keybd_event()函数能触发一个按键事件,也就是说会产生一个WM_KEYDOWN或WM ...

  2. C#模拟PrtScn实现截屏预备知识--剪贴板操作

    剪贴板是Windows操作系统中最常用的功能之一,它用来从一个应用程序向另一个应用程序传递数据,可以是文本,图象,甚至是程序对象.不过剪贴板也有限制,它在某个特定的时间只能指向一块内容,每一个随后复制 ...

  3. selenium模拟登陆之截屏验证码位置跑偏

    在用selenium做爬虫的模拟登陆时遇到验证码图片截取下来的和目标区域的图片不匹配 截到的: 目标是这样的: 明显坐标写的不对,导致截屏区域不是验证码的区域. 只能一步一步取修改坐标,来确定具体的图 ...

  4. Android 模拟按键截屏技巧

    模拟按键(同时按下音量-和电源键)截屏,对于surfaceview播放视频图像的view也可以实现动态截图. 实现方法: 1.编写模拟按键的截屏脚本文件. 如下: #! /system/bin/sh ...

  5. 计算机基础知识教程截屏,最简单的学问:教你如何给电脑屏幕截图,别说你真的会了...

    原标题:最简单的学问:教你如何给电脑屏幕截图,别说你真的会了 有不少朋友用手机拍照片提问固态硬盘的问题,这样真的显得很Low哦,电脑的截图功能一定要学会.假如你认为自己已经会了,看完本文可能还会有新的 ...

  6. python截图工具和模拟鼠标键盘_python PyAutoGUI 模拟鼠标键盘操作和截屏功能

    简介 一款跨平台/无依赖的自动化测试工具,目测只能控制鼠标/键盘/获取屏幕尺寸/弹出消息框/截屏. 安装 pip install pyautogui 鼠标键盘控制 >>> impor ...

  7. 用程序来模拟Alt+PrtSc的键盘事件,实现截屏功能

    用Alt+PrtSc进行截屏时,按键顺序为 step1:按下Alt键 step2:按下PrtSc键 Step3:释放PrtSc键 Step4:释放Alt键 以下程序可用来模拟键的按下和释放 Displ ...

  8. VB用API模拟截屏键PrintScreen

    很多人用 SendKeys "{PRTSC}" 模拟截屏键 PrintScreen 的时候提示<错误:'70' 拒绝的权限>,于是经常遇到人问...干脆写下来 '声明 ...

  9. python PyAutoGUI 模拟鼠标键盘操作和截屏

    简介 一款跨平台/无依赖的自动化测试工具,目测只能控制鼠标/键盘/获取屏幕尺寸/弹出消息框/截屏. 安装 pip install pyautogui 鼠标键盘控制 >>> impor ...

最新文章

  1. 如何将Twitter的内容导入到SAP CRM和C4C
  2. LeetCode每日一题 116. 填充每个节点的下一个右侧节点指针
  3. SQL Server 2008 数据库同步的两种方式 (发布、订阅)
  4. TDD:MS自带的单元测试 之 线程模型和执行顺序
  5. 去除List集合中的重复值(四种好用的方法)
  6. django登录跳转到另一个页面_[JWT]djangojson web token实现单用户登录
  7. 线性筛及其扩展-积性函数
  8. 【分形算法】Jason带你飞之1——LS文法的java实现
  9. python threading.local
  10. 一个新时代的降临:智慧的医疗系统
  11. ERP实施的焦点依然是实施顾问
  12. 现代通信原理2.1:谈谈信号
  13. MAPinfo学习笔记
  14. JVM虚拟机详解(一)JVM与JAVA体系统结构
  15. centos7内网穿透(frp、zerotier)
  16. tolua错误大全-Chinar出品-几乎可为新手解决所有报错情景
  17. win10禁用全角_win10输入法全角半角怎么切换 快捷键使用教程
  18. revel MySQL_Go语言revel环境搭建
  19. sql with ties_SQL WITH TIES子句
  20. HDR显示器在 windows/PC 下正确的使用方式

热门文章

  1. 菱形数阵c语言,二年级奥数数阵习题及参考答案.doc-资源下载在线文库www.lddoc.cn...
  2. 飞象星球落地舟山36所学校 双师课堂化解课后服务区域资源差异
  3. windows文件关联、打开方式列表之修改注册表攻略
  4. javaAPI和android sdk接入百度语音识别
  5. SpringBoot与mockito那点事
  6. shell-手机屏幕录制
  7. word转pdf时python报错:TypeError: This COM object can not automate the makepy process - please run makepy
  8. GWctf-2019-pyre
  9. Kubernetes------二进制双master节点集群部署
  10. PTA n个小朋友分糖果 (10 分)