C#模拟PrtScn实现截屏

有了之前的基础知识了解,如今開始实现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);//down
    System.Windows.Forms.Application.DoEvents(); //加入引用system.windows.forms
    keybd_event((byte)0x2c, 0, 0x2, IntPtr.Zero);//up
    System.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);//down
    System.Windows.Forms.Application.DoEvents();
    System.Windows.Forms.Application.DoEvents();
    keybd_event((byte)0x2c, 0, 0x2, IntPtr.Zero);//up
    keybd_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方法,基于所提供的非托管位图和调色板信息的指针。返回一个托管的BitmapSource
    BitmapSource 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方法//基于所提供的非托管位图和调色板信息的指针,返回一个托管的BitmapSource
    BitmapSource 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 方法。

最后发图不发种:

时间: 2024-08-07 22:06:43

C#模拟PrtScn实现截屏的相关文章

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

Windows提供了一个模拟键盘API函数Keybd_event(),使用该函数可以相应的屏蔽键盘的动作.Keybd_event()函数能触发一个按键事件,也就是说会产生一个WM_KEYDOWN或WM_KEYUP消息.但是已经被SendInput取代. 语法: VOID keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,Ptr dwExtralnfo): 参数: bVk:定义一个虚拟键码.键码值必须在1-254之间. bScan: 定义该键的硬件扫描码.

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

剪贴板是Windows操作系统中最常用的功能之一,它用来从一个应用程序向另一个应用程序传递数据,可以是文本,图象,甚至是程序对象.不过剪贴板也有限制,它在某个特定的时间只能指向一块内容,每一个随后复制的内容都会取代先前的内容.为了在C#中操作剪贴板(包括内容的读取和写入)需要使用到System.Windows.Forms.Clipboard类. Clipboard类: 提供将数据置于系统剪贴板中以及从中检索数据的方法,此类不能被继承. 命名空间: System.Windows.Forms 程序集

VB用API模拟截屏键PrintScreen

很多人用 SendKeys "{PRTSC}" 模拟截屏键 PrintScreen 的时候提示<错误:'70' 拒绝的权限>,于是经常遇到人问...干脆写下来 '声明 Private Declare Sub keybd_event Lib "user32" Alias "keybd_event" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal

【iOS开发-82】四个案例认识Quartz2D:模拟UIImageView、圆形头像切割、打水印、截屏

(1)效果 (2)源代码下载(素材自己替换) http://download.csdn.net/detail/wsb200514/8183437 (3)总结 --所有这些都可以通过封装,基于UIImage开发自己的category. --图形上下文,有开启UIGraphicsBeginImageContextWithOptions,获取UIGraphicsGetCurrentContext和关闭UIGraphicsEndPDFContext等主要操作,有开启就要由关闭. --其他图片和文字,是直

Android 长截屏原理

https://android-notes.github.io/2016/12/03/android%E9%95%BF%E6%88%AA%E5%B1%8F%E5%8E%9F%E7%90%86/   android长截屏原理 小米系统自带的长截屏应该很多人都用过,效果不错.当长截屏时listview就会自动滚动,当按下停止截屏时,就会得到一张完整的截屏. 该篇就介绍一下长截屏的原理 上篇中介绍了android屏幕共享实现方式,该篇的原理和上一篇基本一致. 获取view影像 当我们想得到一个view

iOS开发-检测用户截屏, 并获取所截图片

微信可以检测到用户截屏行为(Home + Power),并在稍后点击附加功能按钮时询问用户是否要发送刚才截屏的图片,这个用户体验非常好.于是乎, 我也想着实现这个功能. 在iOS7之前, 如果用户截屏,系统会自动取消屏幕上的所有 touch 事件,(使用 touchesCancelled:withEvent: 这个方法)那么我们就可以检测这个方法的调用,然后加载本地最新图片再加以判断来实现我们的目的.但在 iOS 7 之后,截屏不再会取消屏幕的 touch 事件,所以导致了 Snapchat 和

nodejs+phantomjs+七牛 实现截屏操作并上传七牛存储

近来研究了下phantomjs,只是初涉,还谈不上深入研究,首先介绍下什么是phantomjs. 官网上的介绍是:”PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast and native support for various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG.”翻译过来就是:”PhantomJS

python关于威尼斯人平台搭建win32api与ImageGrab.grab()截屏少内容的问题

前提:和系统威尼斯人平台搭建论坛:haozbbs.com Q1446595067 有关系.有的不少内容,有的少.我是在测试环境下一点问题都没有,结果跑到生产环境就不行了.由于生产环境不能重装系统等因素,所有采用了本文的解决方案. 系统环境:win7 x64 项目介绍:使用pyautogui对pc端应用程序做自动化操作. 项目一开始使用的pyautogui.locateOnScreen("xxx.png")来定位,使用pyautogui.click()来实现点击,使用typewrite(

iOS截屏并修改截图然后分享的功能实现

一. 实现的效果类似微博的截图分享 不仅截图分享的时候还进行图片的修改,增加自己的二维码 二.实现方式 苹果在ios7之后提供了一个新的通知类型:UIApplicationUserDidTakeScreenshotNotification, 这个通知会告知注册了此通知的对象已经发生了截屏事件,然后我们就可以在这个事件中实现自己的逻辑 1.注册通知 - (void)viewDidLoad { [super viewDidLoad]; //注册用户的截屏操作通知 [[NSNotificationCe