2013-05-05 28 views
2

首先,对于长期问题抱歉,但我想确保我包括我到目前为止所做的所有事情。捕获并保存屏幕截图,你点击 - Windows C#

我想为教程小组制作一个C#Windows应用程序,它将用作他们执行无聊手动任务的替代方法,按Alt + PrtSc键显示执行教程步骤时出现的每个窗口并将其粘贴ms paint将图像保存到文件夹,以便稍后将其插入教程文档中。

捕获桌面快照或仅部分桌面快照的方法有多种。然而,我甚至可以设法在我的WinForms应用程序中拍摄控件的快照;只要您点击并保存它就会捕捉任何窗口的屏幕截图(以及鼠标指针),结果会变得有点棘手。

我碰到过this的帖子,其中详细介绍了使用Win32 API捕获和保存屏幕截图。 Thisthis这篇文章讨论了如何通过仅使用.NET Framework来保存桌面的一部分,它运行良好,但它不完全是我所需要的。我遇到了一些免费软件和其他商业软件,它们也做了很多和一些这样的事情,但我更愿意做一些简单和定制的事情。

现在,我的表单有一个浏览按钮来选择一个文件夹(将图像保存到)和另一个名为START的按钮。点击时名称变为STOP,并保持压低状态(直到再次点击停止)。

假设,团队必须整理软件的设置和安装教程,向导的欢迎屏幕已启动。随着应用程序启动,随着您继续单击按钮,如继续,我接受,下一步...下一步和完成,应该保存安装向导的每个窗口的图像(连同鼠标指针)。

我希望我能解释清楚。任何帮助将不胜感激。提前致谢。

  • GJ
+0

BTW ...令我惊讶的是(在进一步阅读之后),我在Win7中遇到了一个名为psr.exe的内置工具,它完全符合我上面提到的内容,但它将输出保存在.mht中,并且图像在该区域附近有一些华丽的图形点击鼠标的地方。 – 2013-05-05 07:14:24

回答

0

我使用AutoHotkey的脚本触发GadWin(http://www.gadwin.com/printscreen/)注意Gadwin是免费的仅用于个人使用解决了类似的问题。商业许可证可以购买(25美元)

我也有一些C#代码,你可能喜欢,这是免费的。

AutoHotKey脚本: #SingleInstance Force ;点击屏幕 - 每次点击都是一个新的屏幕截图 ;记录每次点击鼠标的屏幕截图 ;用于Gadwin或由按键触发的其他屏幕捕获,例如{PRINTSCREEN} ; 〜意为通过点击 ;开启和关闭

; open destination folder 
destinationFolder:=GadWinDestinationFolder() 
ifExist %destinationFolder% 
{ 
    Run explorer.exe %destinationFolder% 
    sleep 1000 
} 

;; shows an opening message 
; TBD could be on a message box to let user choose/acknowledge 
ShowStatus("Capture is Enabled.`n<Pause/Break> to toggle on/off", 10000) 

; *** ,% <space> func() is autohotkey magic for interpolate a function here *** 
RunWait,% GadWinExe() 
sleep 5000 

capturing:=true  


Return 

; ~ means pass the click & position through to the system 
; This allows drag screens to work, while Send LButton does not 
; TBS look at MouseGetPos + MouseClickDrag 
~LButton:: 
    Capture() 
    ;Send {LButton} 
    return 

~RButton:: 
    Capture() 
    ;Send {RButton} 
    Return 

Capture() 
{ 
    global capturing 
    if (capturing) 
    { 
     ;ClipSaved:=ClipboardAll ; Save the entire clipboard to a variable 

     ; this may be whacking the clipboard 
     ; alt -prt scrn 

     Send {PRINTSCREEN} 

     ShowStatus("Captured to " GadWinDestinationFolder() "`nPress <Pause/Break> to toggle.", 3000) 

     ;Clipboard:=ClipSaved ; Restore the original clipboard. Note the use of Clipboard (not ClipboardAll). 
     ;ClipSaved:=   ; Free the memory in case the clipboard was very large. 
    } 
    Else 
    { 
     dp("Capture is off`nPress <Pause/Break> to toggle.") 
    } 
    Return 
} 


PAUSE:: CaptureToggle(2000) 

CaptureToggle(delay) 
{ 
    global capturing 

    Suspend OFF 

    capturing:=!capturing 

    If (capturing) 
    { 
     ShowStatus("Capture Enabled.", delay) 
    } 
    Else 
    { 
     ShowStatus("Capture Disabled.", delay) 
     ;Suspend 
    } 

    Return 
} 

GadWinExe() 
{ 
    RegRead, exeFolder, HKLM, SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Gadwin PrintScreen, InstallLocation 
    Return exeFolder "\PrintScreen.exe" 
} 

GadWinDestinationFolder() 
{ 
    ; Gadwin specific 
    RegRead, CaptureDir, HKEY_CURRENT_USER, Software\Gadwin Systems\PrintScreen\Destination, CaptureDir 
    Return CaptureDir 
} 

ShowStatus(msg, time) 
{ 
    ShowTrayTip("ClickScreen", msg, time) 
} 

; Generic Show and Remove Tray Tip 
ShowTrayTip(title, msg, time) 
{ 
    ; 7/7/2011 Win Server 2008 - 30 seems to have no effect 
    TrayTip, %title%, %msg%, 30, 1 
    SetTimer, RemoveTrayTip, %time%   ; used to ensure tip is taken down 
    dp(msg) 
    Return 

; The Traytip does not disappear quickly without this 
; 7/7/2011 Win Server 2008 - tip disappears after 4 seconds anyway if the script continues to run 
RemoveTrayTip: 
    SetTimer, RemoveTrayTip, Off 
    TrayTip 
    dp("TrayTip off") 
    Return 
} 

FindAndRun(exeName) 
{ 
    ; Here I get to define the folders to search 
    ProgramFolders:="P:\Program Files,C:\Program Files,C:\Program Files (x86)" 
    Loop, parse, ProgramFolders, `, 
    { 
     IfExist, %A_LoopField%\%exeName% 
     { 
      Run %A_LoopField%\%exeName% 
      Return 
     } 
    } 
    MsgBox File %exeName% not found 
} 

dp(Msg) 
{ 
    OutputDebug %A_ScriptName% %Msg% 
} 

的C#

using System;  
using System.Drawing;  
using System.IO;  
using System.Drawing.Imaging;  
using System.Runtime.InteropServices;  

//Based on code of Agha Ali Raza (http://www.csharphelp.com/archives2/archive393.html)  

namespace Script  
{  
    public class CaptureScreen  
    {  
     const string usage = "Usage: printScreen.cs [filename]\n"+  
      "Captures screen image and saves it to a file (default file: screen.gif)\n";  

     static public void Main(string[] args)  
     {  
      if (args.Length == 1 && (args[0] == "?" || args[0] == "/?" || args[0] == "-?" || args[0].ToLower() == "help"))  
      {  
       Console.WriteLine(usage);  
      }  
      else  
      {  
       try  
       {  
        Bitmap capture = CaptureScreen.GetDesktopImage();  
        string file = Path.Combine(Environment.CurrentDirectory, "screen.gif");  
        ImageFormat format = ImageFormat.Gif;  

        if (args.Length == 1)  
        {  
         file = args[0];  
         if (args[0].ToUpper().EndsWith(".GIF"))  
          format = ImageFormat.Gif;  
         else if (args[0].ToUpper().EndsWith(".BMP"))  
          format = ImageFormat.Bmp;  
         else if (args[0].ToUpper().EndsWith(".JPEG"))  
          format = ImageFormat.Jpeg;  
         else if (args[0].ToUpper().EndsWith(".PNG"))  
          format = ImageFormat.Png;  

        }  
        capture.Save(file, format);  
       }  
       catch (Exception e)  
       {  
        Console.WriteLine(e);  
       }  
      }  
     }  

     public static Bitmap GetDesktopImage()  
     {  
      WIN32_API.SIZE size;  

      IntPtr hDC = WIN32_API.GetDC(WIN32_API.GetDesktopWindow());  
      IntPtr hMemDC = WIN32_API.CreateCompatibleDC(hDC);  

      size.cx = WIN32_API.GetSystemMetrics(WIN32_API.SM_CXSCREEN);  
      size.cy = WIN32_API.GetSystemMetrics(WIN32_API.SM_CYSCREEN);  

      m_HBitmap = WIN32_API.CreateCompatibleBitmap(hDC, size.cx, size.cy);  

      if (m_HBitmap!=IntPtr.Zero)  
      {  
       IntPtr hOld = (IntPtr) WIN32_API.SelectObject(hMemDC, m_HBitmap);  
       WIN32_API.BitBlt(hMemDC, 0, 0,size.cx,size.cy, hDC, 0, 0, WIN32_API.SRCCOPY);  
       WIN32_API.SelectObject(hMemDC, hOld);  
       WIN32_API.DeleteDC(hMemDC);  
       WIN32_API.ReleaseDC(WIN32_API.GetDesktopWindow(), hDC);  
       return System.Drawing.Image.FromHbitmap(m_HBitmap);  
      }  
      return null;  
     }  

     protected static IntPtr m_HBitmap;  
    }  

    public class WIN32_API  
    {  
     public struct SIZE  
     {  
      public int cx;  
      public int cy;  
     }  
     public const int SRCCOPY = 13369376;  
     public const int SM_CXSCREEN=0;  
     public const int SM_CYSCREEN=1;  

     [DllImport("gdi32.dll",EntryPoint="DeleteDC")]  
     public static extern IntPtr DeleteDC(IntPtr hDc);  

     [DllImport("gdi32.dll",EntryPoint="DeleteObject")]  
     public static extern IntPtr DeleteObject(IntPtr hDc);  

     [DllImport("gdi32.dll",EntryPoint="BitBlt")]  
     public static extern bool BitBlt(IntPtr hdcDest,int xDest,int yDest,int wDest,int hDest,IntPtr hdcSource,int xSrc,int ySrc,int RasterOp);  

     [DllImport ("gdi32.dll",EntryPoint="CreateCompatibleBitmap")]  
     public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);  

     [DllImport ("gdi32.dll",EntryPoint="CreateCompatibleDC")]  
     public static extern IntPtr CreateCompatibleDC(IntPtr hdc);  

     [DllImport ("gdi32.dll",EntryPoint="SelectObject")]  
     public static extern IntPtr SelectObject(IntPtr hdc,IntPtr bmp);  

     [DllImport("user32.dll", EntryPoint="GetDesktopWindow")]  
     public static extern IntPtr GetDesktopWindow();  

     [DllImport("user32.dll",EntryPoint="GetDC")]  
     public static extern IntPtr GetDC(IntPtr ptr);  

     [DllImport("user32.dll",EntryPoint="GetSystemMetrics")]  
     public static extern int GetSystemMetrics(int abc);  

     [DllImport("user32.dll",EntryPoint="GetWindowDC")]  
     public static extern IntPtr GetWindowDC(Int32 ptr);  

     [DllImport("user32.dll",EntryPoint="ReleaseDC")]  
     public static extern IntPtr ReleaseDC(IntPtr hWnd,IntPtr hDc);  
    }  

}  

希望这将得到钥匙切换捕捉你开始

1

试着输入这个保存截图:

int screenWidth = Screen.PrimaryScreen.Bounds.Width; 
int screenHeight = Screen.PrimaryScreen.Bounds.Height; 

     Graphics Graphics1; 
     Bitmap Bitmap1 = new Bitmap(screenWidth, screenHeight); 
     Graphics1 = Graphics.FromImage(Bitmap1); 
     Graphics1.CopyFromScreen(Point.Empty, Point.Empty, Screen.PrimaryScreen.Bounds.Size); 
     Bitmap1.Save(@"c:\ScreenShot1.bmp); //Place that you want to save screenshot