Mat Posted October 31, 2009 Posted October 31, 2009 (edited) I decided that since nothing at the moment uses a combination of the Ctrl key and the middle mouse button... I would. Hold down Ctrl and drag with the middle mouse button and a rather makeshift rectangle will follow. If you drag an area less than $nClick (default is 50px) then it will capture the active window instead.There is also a few more functions in the tray menu. All files are stored in $sDataDump (Default @TempDir & "\QuickScreenerDump\"), as png's, and every time you take a screen shot, the filename is copied to the clipboard, and an entry is written into the log (default @ScriptDir & "\log.ini")There is probably a better way to draw the rectangle, but I can't be asked to do any graphics at the moment.expandcollapse popup#NoTrayIcon #include<ScreenCapture.au3> #include<WindowsConstants.au3> #include<Array.au3> Opt("TrayMenuMode", 3) Opt("TrayOnEventMode", 1) If WinExists("Autoit Screener tool hidden window") Then ProcessClose(WinGetProcess("Autoit Screener tool hidden window")) AutoItWinSetTitle("Autoit Screener tool hidden window") ; Settings Global $sLog = @ScriptDir & "\log.ini" ; More settings Global $iCounter = IniRead($sLog, "settings", "counter", 1) Global $sFolder = IniRead($sLog, "settings", "folder", @ScriptDir & "\dump\") Global $sMask = IniRead($sLog, "settings", "mask", "#") Global $nClick = IniRead($sLog, "settings", "clickarea", 10) Global $sMaskMru = IniRead($sLog, "settings", "mask_mru", $sMask) Global $ahMaskList[10] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] If DirGetSize($sFolder) = -1 Then DirCreate($sFolder) If StringRight($sFolder, 1) <> "\" Then $sFolder &= "\" If StringRight($sMaskMru, 1) = "|" Then $sMaskMru = StringTrimRight($sMaskMru, 1) Global $hUser32 = DllOpen("user32.dll") Global $hGUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, BitOR($WS_BORDER, $WS_POPUP), BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST)) GUISetBkColor(0xFF0000) WinSetTrans($hGUI, "", 100) GUICtrlSetResizing(-1, 802) TraySetIcon("C:\WINDOWS\system32\SHELL32.dll", 23) $hMenu = TrayCreateMenu("Capture") TrayCreateItem("Capture Screen", $hMenu) TrayItemSetOnEvent(-1, "_Capt") TrayCreateItem("Capture window", $hMenu) TrayItemSetOnEvent(-1, "_CaptWnd") TrayCreateItem("") Global $hMaskMenuRoot = TrayCreateMenu("&Mask") Global $hMaskMenu = TrayCreateItem($sMask, $hMaskMenuRoot, 0) TrayItemSetOnEvent(-1, "_MaskSet") TrayCreateItem("", $hMaskMenuRoot) $aList = StringSplit($sMaskMru, "|") If $aList[0] > 9 Then $aList[0] = 9 $ahMaskList[0] = $aList[0] For $n = 1 To $aList[0] $ahMaskList[$n] = TrayCreateItem("&" & $n & ". " & $aList[$n], $hMaskMenuRoot, $n + 1) TrayItemSetOnEvent(-1, "_MaskSetMru") Next $aList = 0 TrayCreateItem("") $hMenu = TrayCreateMenu("&Counter") Global $hCounterMenu = TrayCreateItem($iCounter, $hMenu) TrayItemSetOnEvent(-1, "_CounterSet") TrayCreateItem("&Clear", $hMenu) TrayItemSetOnEvent(-1, "_CounterClear") TrayCreateItem("") $hMenu = TrayCreateMenu("&Folder") TrayCreateItem("&Open", $hMenu) TrayItemSetOnEvent(-1, "_Open") TrayCreateItem("&Clear", $hMenu) TrayItemSetOnEvent(-1, "_Clear") TrayCreateItem("C&hange...", $hMenu) TrayItemSetOnEvent(-1, "_Change") TrayCreateItem("") $hMenu = TrayCreateMenu("Log") TrayCreateItem("Open", $hMenu) TrayItemSetOnEvent(-1, "_Openlog") TrayCreateItem("Clear", $hMenu) TrayItemSetOnEvent(-1, "_Clearlog") TrayCreateItem("") TrayCreateItem("Exit") TrayItemSetOnEvent(-1, "_Exit") TraySetToolTip("The window screener tool") TraySetState() TrayTip("Screener Version 1.2", "Use Ctrl + The middle mouse button to capture an area or window." & @CRLF & @CRLF & _ "You can access additional functions through the tray menu.", 15, 1) While 1 If _Pressed("Ctrl") And _Pressed("Middle") Then $hWnd = WinGetHandle("[active]", "") WinSetState($hWnd, "", @SW_DISABLE) $aPos = _GetArea() If ($aPos[2] - $aPos[0] < $nClick) Or ($aPos[3] - $aPos[1] < $nClick) Then $aPos = WinGetPos($hWnd, "") $aPos[2] += $aPos[0] $aPos[3] += $aPos[1] EndIf WinSetState($hWnd, "", @SW_ENABLE) $sFile = _GetFile() _ScreenCapture_Capture($sFile, $aPos[0], $aPos[1], $aPos[2], $aPos[3], False) ClipPut($sFile) _WriteLog($sFile, 1) _CounterSet(-2) ElseIf _Pressed("Print") Then $sFile = _GetFile() _ScreenCapture_Capture($sFile, 0, 0, @DesktopWidth, @DesktopHeight, False) ClipPut($sFile) _WriteLog($sFile, 2) _CounterSet(-2) EndIf Sleep(10) WEnd Func _MaskSetMru() $s = StringTrimLeft(TrayItemGetText(@TRAY_ID), 4) _MaskSet($s) EndFunc Func _MaskSet($s = "") If Not IsDeclared("s") Then $s = "" If $s = "" Then $s = InputBox("Mask", "Please enter the mask to use." & @CRLF & @CRLF & "'#' => The counter", $sMask, " M") If @error Then Return EndIf $s = StringStripWS($s, 3) $sMask = $s $aList = StringSplit($sMaskMru, "|") If $aList[0] > 9 Then $aList[0] = 9 $i = 0 While $i < $aList[0] $i += 1 If $aList[$i] = $sMask Then _ArrayDelete($aList, $i) $aList[0] = UBound($aList) - 1 EndIf WEnd _ArrayInsert($aList, 1, $sMask) $aList[0] -= 1 If $aList[0] > 9 Then $aList[0] = 9 $sMaskMru = _ArrayToString($aList, "|", 1, 9) For $i = 1 To $aList[0] If $ahMaskList[$i] = 0 Then TrayCreateItem("&" & $i & ". " & $aList[$i], $hMaskMenuRoot, $i + 1) TrayItemSetOnEvent(-1, "_MaskSetMru") Else TrayItemSetText($ahMaskList[$i], "&" & $i & ". " & $aList[$i]) EndIf Next For $i = $aList[0] + 1 To 9 If $ahMaskList[$i] = 0 Then ExitLoop TrayItemDelete($ahMaskList[$i]) $ahMaskList[$i] = 0 Next TrayItemSetText($hMaskMenu, $sMask) EndFunc Func _CounterClear() _CounterSet(1) EndFunc Func _Change() $s = FileSelectFolder("Select folder", "", 7, $sFolder) If @error Then Return $sFolder = $s If StringRight($sFolder, 1) <> "\" Then $sFolder &= "\" EndFunc Func _CounterSet($i = -1) If Not IsDeclared("i") Then $i = -1 If $i = -2 Then $iCounter += 1 ElseIf $i < 0 Then $i = InputBox("Counter", "Please enter the counter value", $iCounter, " M") If @error Then Return $iCounter = Int($i) Else $iCounter = Int($i) EndIf TrayItemSetText($hCounterMenu, $iCounter) EndFunc Func _GetFile() Return $sFolder & StringReplace($sMask, "#", $iCounter) & ".jpg" EndFunc ;==>_GetFile Func _Pressed($key) Switch StringLower($key) Case "Left" $iHex = "01" Case "middle" $iHex = "04" Case "ctrl" $iHex = "11" Case "print" $iHex = "2C" Case Else Return -1 EndSwitch $aIsPressed = DllCall($hUser32, "int", "GetAsyncKeyState", "int", "0x" & $iHex) If @error Or (BitAND($aIsPressed[0], 0x8000) <> 0x8000) Then Return 0 Return 1 EndFunc ;==>_Pressed Func _GetArea() Local $aPos = MouseGetPos(), $aLast[2] = [-1, -1], $aPosFirst = MouseGetPos(), $aRet[4] WinMove($hGUI, "", $aPosFirst[0], $aPosFirst[1], 1, 1) GUISetState(@SW_SHOW, $hGUI) While _Pressed("Middle") $aPos = MouseGetPos() If ($aPos[0] <> $aLast[0]) Or ($aPos[1] <> $aLast[1]) Then $aRet[0] = $aPosFirst[0] $aRet[1] = $aPosFirst[1] $aRet[2] = $aPos[0] $aRet[3] = $aPos[1] If $aRet[0] > $aRet[2] Then $tmp = $aRet[0] $aRet[0] = $aRet[2] $aRet[2] = $tmp EndIf If $aRet[1] > $aRet[3] Then $tmp = $aRet[1] $aRet[1] = $aRet[3] $aRet[3] = $tmp EndIf WinMove($hGUI, "", $aRet[0], $aRet[1], $aRet[2] - $aRet[0], $aRet[3] - $aRet[1]) $aLast = $aPos EndIf ToolTip($aRet[2] - $aRet[0] & " x " & $aRet[3] - $aRet[1]) Sleep(10) WEnd ToolTip("") GUISetState(@SW_HIDE, $hGUI) Return $aRet EndFunc ;==>_GetArea Func _WriteLog($sFile, $nType) IniWrite($sLog, @MDAY & "." & @MON & "." & @YEAR, @MIN & ":" & @HOUR & ":" & @SEC & ":" & @MSEC & "_" & $nType, StringRegExpReplace($sFile, ".*\\", "")) EndFunc ;==>_WriteLog Func _Capt() $sFile = _GetFile() _ScreenCapture_Capture($sFile, 0, 0, @DesktopWidth, @DesktopHeight, False) ClipPut($sFile) _WriteLog($sFile, 3) _CounterSet(-2) EndFunc ;==>_Capt Func _CaptWnd() WinSetTrans($hGUI, "", 1) WinMove($hGUI, "", 0, 0, @DesktopWidth, @DesktopHeight) GUISetCursor(3, 1, $hGUI) GUISetState(@SW_SHOW, $hGUI) While Not _Pressed("Left") WEnd GUISetState(@SW_HIDE, $hGUI) GUISetCursor(1, 1, $hGUI) MouseClick("") $aPos = WinGetPos("[active]") WinSetTrans($hGUI, "", 100) $aPos[2] += $aPos[0] $aPos[3] += $aPos[1] $sFile = _GetFile() _ScreenCapture_Capture($sFile, $aPos[0], $aPos[1], $aPos[2], $aPos[3], False) ClipPut($sFile) _WriteLog($sFile, 4) _CounterSet(-2) EndFunc ;==>_CaptWnd Func _OpenLog() ShellExecute($sLog) EndFunc ;==>_OpenLog Func _ClearLog() FileDelete($sLog) IniWrite($sLog, "settings", "counter", $iCounter) IniWrite($sLog, "settings", "folder", $sFolder) IniWrite($sLog, "settings", "mask", $sMask) IniWrite($sLog, "settings", "clickarea", $nClick) EndFunc ;==>_ClearLog Func _Open() ShellExecute($sFolder) EndFunc ;==>_Open Func _Clear() DirRemove($sFolder, 1) DirCreate($sFolder) _WriteLog("\Cleared data", 5) EndFunc ;==>_Clear Func _Exit() TraySetState(2) IniWrite($sLog, "settings", "counter", $iCounter) IniWrite($sLog, "settings", "folder", $sFolder) IniWrite($sLog, "settings", "mask", $sMask) IniWrite($sLog, "settings", "clickarea", $nClick) IniWrite($sLog, "settings", "mask_mru", $sMaskMru) Exit EndFunc ;==>_ExitThe tray menu, and an example of an image generated using this toolMat Edited October 27, 2010 by Mat AutoIt Project Listing
BrewManNH Posted October 26, 2010 Posted October 26, 2010 I know this is an old topic, but I was searching for a script that would let me do what this script does and I have to say this one works great. Thanks for posting it, it saved me a lot of work when I had to write up a document for a user that needed screenshots of the steps needed to do something on her computer. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator
Mat Posted October 26, 2010 Author Posted October 26, 2010 I know this is an old topic, but I was searching for a script that would let me do what this script does and I have to say this one works great. Thanks for posting it, it saved me a lot of work when I had to write up a document for a user that needed screenshots of the steps needed to do something on her computer.I now use FSCapture. It has a nice function for entering templates, e.g. ScreenshotForProgram####.jpghttp://www.faststone.org/FSCaptureDetail.htmHowever, I still like the way my program uses ctrl and the middle mouse button. It means I can do it so much easier if fsc implemented that it would be great. AutoIt Project Listing
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now