ionman
12/20/2017 - 4:12 AM

Capture Screenshot

Capture Screenshot

' *******************************************************************************
' PROJECT.......: [vbscript] Capture Screenshot (experimental)
' SCRIPT........: tool.CaptureScreenshot.vbs
' DESCRIPTION...: capture screen shot and save as an image
' REQUIREMENTS..: OS: Windows with Microsoft Paint (画图)
'                 Microsoft Word: tested on 2007/2010
' CREATED.......: 20180208
' AUTHOR........: Ion Chen
' NOTES.........:
'                 
' UPDATE........:
'                 20171220 fix: numlock turns off everytime.
'                 20180208 add: check after done, and view it if secceeded.
' TO-DO.........:
'                [ ] Capture Window Only.
'                [ ] Count Down before Capturing.
' *******************************************************************************

' ===============================================================================
'  START OF SCRIPT
' ===============================================================================
Option Explicit
On Error Resume Next

    ' ---------------------------------------------------------------------------
    '  Declare Constants
    ' ---------------------------------------------------------------------------
    ' SET_PATH_OF_FOLDER_TO_SAVE_SCREENSHOTS
    Const SCREENSHOT_FOLDER = "C:\"
    ' CAPTURE_FULLSCREEN_OR_ACTIVE_WINDOW_ONLY
    Const SAVE_FULLSCREEN = True

'**Start Encode**
    ' ---------------------------------------------------------------------------
    '  Declare Variables
    ' ---------------------------------------------------------------------------

    ' ===============================================================================
    '  SUBROUTINES/FUNCTIONS/CLASSES
    ' ===============================================================================
    Call SaveScreenAsImage

    ' --------------------------------------------------------------------------
    '  SUBROUTINE.....:  SaveScreenAsImage
    '  PURPOSE........:  Save current screen as an image.
    '  EXAMPLE........:  Call SaveScreenAsImage
    ' --------------------------------------------------------------------------
    Sub SaveScreenAsImage

        ' SET_FILENAME_AS_CURRENT_DATETIME
        Dim sFileName : sFileName = SCREENSHOT_FOLDER & "Screenshot_" & _
            GetDateTimeNoSeparator(Now)
        Dim WshShell : Set WshShell = WScript.CreateObject("WScript.Shell")
        Dim objFSO : Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
        Dim strCmdOpenFile, strFileExtenstion
        
        ' GO_AROUND_WSH_AND_CAPTURE_SCREEN_(SINCE_IT_HAS_BEEN_DISABLED)
        With CreateObject("Word.Basic")
            If SAVE_FULLSCREEN _
            Then .Sendkeys "{PrtSc}" _
            Else .Sendkeys "%{PrtSc}"
            .FileQuit
        End With
        
        ' RESUME_NUMLOCK_AFTER_PRINT_SCREEN
        WshShell.SendKeys "{NUMLOCK}"
        
        ' RUN_MSPAINT
        WshShell.Run "mspaint.exe", 4
        WScript.Sleep 300
        WshShell.AppActivate "画图"
        WshShell.AppActivate "paint"
        ' PASTE_TO_MSPAINT_AND_SAVE_AS_AN_IMAGE_FILE
        WScript.Sleep 100
        WshShell.SendKeys "^(v)"
        WshShell.SendKeys "^(s)"
        WScript.Sleep 500
        WshShell.SendKeys sFileName
        WshShell.SendKeys "%(s)"
        ' CLOSE_MSPAINT
        WScript.Sleep 100
        WshShell.SendKeys "%{F4}"
        ' CHECK_WHETHER_IMAGE_FILE_EXISTS
        WScript.Sleep 100
        If objFSO.FileExists(sFileName & ".png") Then
            strFileExtenstion = ".png"
        ElseIf objFSO.FileExists(sFileName & ".jpg") Then
            strFileExtenstion = ".jpg"
        ElseIf objFSO.FileExists(sFileName & ".bmp") Then
            strFileExtenstion = ".bmp"
        Else
            MsgBox "Screenshot Failed, Please Try Again." 
            Exit Sub
        End If
        ' OPEN_IMAGE_FILE
        strCmdOpenFile = "rundll32.exe %WinDir%\System32\shimgvw.dll,ImageView_Fullscreen " & _
            sFileName & strFileExtenstion
        WshShell.Run strCmdOpenFile
    End Sub

    ' --------------------------------------------------------------------------
    '  FUNCTION.......:  GetDateTimeNoSeparator(dSpecTime)
    '  PURPOSE........:  Get current date and time formated as YYYYMMDDHHMMSS
    '  EXAMPLE........:  MsgBox GetDateTimeNoSeparator(Now)
    ' --------------------------------------------------------------------------
    Function GetDateTimeNoSeparator(dSpecTime)
        If Not IsDate(dSpecTime) Then dSpecTime = Now()
        GetDateTimeNoSeparator = Year(dSpecTime) _
            & Right("0" & Month(dSpecTime), 2) _
            & Right("0" & Day(dSpecTime), 2) _
            & Right("0" & Hour(dSpecTime), 2) _
            & Right("0" & Minute(dSpecTime), 2) _
            & Right("0" & Second(dSpecTime), 2)
    End Function