Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Capture screeshots with a nice GUI (and IrfanView)


  • Please log in to reply
48 replies to this topic
toralf
  • Moderators
  • 4035 posts
  • Last active: Aug 20 2014 04:23 PM
  • Joined: 31 Jan 2005
This is a small app I did as a reproduction of a tool I use on UNIX. It's name is EasyCopy from www.augrin.com.
Thus I named this script Easy Copy AHK

This app uses IrfanView to do the screenshots and manipulation. You can get the executable from www.irfanview.com
My app also needs the plugin Effects.dll in the plugin folder.

Idea and technique to draw the frame with DllCall are from shimanov
www.autohotkey.com/forum/viewtopic.php?t=5206

Several new features added by hps

Easy Copy AHK Features: - Take screenshots from full screen, window or client area
- Take screenshots of multiple screen desktops (if irfanview gets fixed)
- Take screenshots by draging a frame to capture rectangular regions
- redo screenshot operation
- show preview or save image directly to disc
- autonumber image files if any amount of "#" is in file name
- save screenshot in all image types IrfanView supports
- print preview on default printer
- open destination folder in explorer or as thumbnails in Infanview
- aboard all operations with Esc
- toggle AlwaysOnTop with MButton on Gui
- several options for the screenshot
+ hide mouse for screenshot
+ hide gui at start up or after screenshot
+ copy screenshot aslo to clipboard
+ show and hide gui with a single click (RButton on Gui, LButton on tray icon)
+ move region frame before taking screenshot
+ adjust color, thickness and style of frame and lines
+ draw cross and golden cut lines in region frame
+ Assign hotkeys to all screenshot actions
+ Change color depth of screenshot
+ swap black and white of screenshot
+ change screenshot to gray scale
+ apply sharpen or contrast filter on screenshot
+ adjust JPG and TIF saving quality for screenshot
[/list]
This script has around 1250 lines (including 190 empty lines and 270 comment lines, thus around 800 lines of code). Approximately:
- 400 lines for the GUI
- 300 lines for the "normal" screenshot action
- 500 lines for the regional screenshot action

Edit:
050908: Added "" around image name to make spaces in filename and path save (Thanks 172x)
050908: Added a backup icon ID 14 (Thanks AGU)
050908: Added new options as in AHK 1.0.38.02 (Thanks Chris)
050909: Added FileSelect for IrfanView and saving in Ini
050911: Moved def of Ini file further up (thanks hps)
050912: New tray option to show Gui (thanks corrupt)
050912: New Gui button and tray option to open destination (thanks corrupt)
050925: Several new features added by hps (currently 1366 lines of code)
051112: Restructured the code to be able to have more then two # for automatic numbering of files
060125: normal hotkeys for RButton (RollUp or Hide) and MButton (Toggle AOT) on GUI have been replaced with OnMessage() since they caused problems with other apps.
060726: Inifile name is changed, not to contain the ".exe" or ".ahk" ending of the script file name (thanks silveredge78)

;#   GUI to create screenshots easily 
;# 
;#   OS: Windows XP 
;#   AHK version: 1.0.41.00   (http://www.autohotkey.com/download/) 
;#   Date: 2006-01-25 
;# 
;#   inspired by EasyCopy from http://www.augrin.com 
;#   which we have on UNIX but not on PC 
;# 
;#   Idea and technique to draw the frame with DllCall are from shimanov 
;#   http://www.autohotkey.com/forum/viewtopic.php?t=5206 
;# 
;#   Several new features added by hps
;#
;#   Requires: IrfanView 
;# 
;#   Known problems: 
;#      - 
;# 
;#   Wish list: 
;#      - Auto-Interval (image sequence in timesteps) 
;#      - Create Multi-Tif 
;#      - Create Amimation with VideoMach 

;#############   Directives   ################################################# 

;IrfanView: Tool, to process image files; source: "http://www.irfanview.com" 
;in the subfolder "Plugins" of IrfanView the file "Effects.dll" is needed. 
;as a default the executable and subfolder with the dll is assumed to be in the same folder with the script 
SplitPath, A_ScriptName,,,, ScriptNoExt 
StartCenterIni      = %ScriptNoExt%.ini
IniRead, ExeCapture, %StartCenterIni%, EasyCopy, ExeCapture, i_view32.exe 
If not FileExist(ExeCapture) 
  { 
    FileSelectFile, ExeCapture , 3, , Please select the executable of IrfanView (i_view32.exe), Executables (*.exe) 
    If ( not FileExist(ExeCapture) or not ExeCapture ) 
      { 
        MsgBox, 16, IrfanView not found,The executable of Irfanview`n%ExeCapture%`ncouldn't be found.`nThe script will exit now. 
        ExitApp 
      } 
    IniWrite, %ExeCapture%, %StartCenterIni%, EasyCopy, ExeCapture 
  } 

Version             = v0.7
EasyCopyWindowtitle = Easy Copy AHK 
EasyCopyIconID      = 175 
PathProjects        = %A_ScriptDir% 

;location of icon file 
If ( A_OSType = "WIN32_WINDOWS" )  ; Windows 9x 
    IconFile = %A_WinDir%\system\shell32.dll 
else 
    IconFile = %A_WinDir%\system32\shell32.dll 

;get screen size
ScreenWidth = %A_ScreenWidth% 
ScreenHeight = %A_ScreenHeight% 

;the followup version to Irfanview 3.9.7.0 will be able to capture regions on secondary monitors 
FileGetVersion, ExeCaptureversion , %ExeCapture% 
If ExeCaptureVersion > 3.9.7.0 
  {
    ; get screen size from virtual screen
    Sysget, ScreenWidth, 78 
    Sysget, ScreenHeight, 79 
  } 

#SingleInstance force                           ;enforce only one instance 
SetBatchLines, -1 
CoordMode, Mouse, Screen 

;get previous settings 
GoSub, ReadDefaultsFromIni 

;Tray menu 
Menu, Tray, UseErrorLevel 
Menu, Tray, Icon, %IconFile%, %EasyCopyIconID%  ;icon for window and for proces in task manager 
If ErrorLevel 
    Menu, Tray, Icon, %IconFile%, 14  ;different icon ID, if Iconfile doesn't contain enough Icons 
Menu, Tray, UseErrorLevel, Off 
Menu, Tray, NoStandard 
Menu, Tray, Tip, %EasyCopyWindowtitle% 
Menu, Tray, Add, Show EasyCopy, TrayShowGui 
Menu, Tray, Add, Open Destination, BtnOpen 
Menu, Tray, Add, Options, BtnOptions 
Menu, Tray, Add, Capture Screen, BtnCaptureScreen 
Menu, Tray, Add, Capture Window, BtnCaptureWindow 
Menu, Tray, Add, Capture Client Area, BtnCaptureClientArea 
Menu, Tray, Add, Capture Region, BtnCaptureRegion 
Menu, Tray, Add, Capture Redo, BtnRedoCapture 
Menu, Tray, Add, Exit, GuiClose 
Menu, Tray, Default, Show EasyCopy 
If ShowGuiWithSingleCLick 
   Menu, Tray, Click, 1 

;Show GUI 
GoSub, BuildGuiEasyCopy 

;Activate hotkeys 
GoSub, ActivateHotKeys 

;activate gui mouse hotkeys
WM_RBUTTONDOWN = 0x204 
OnMessage(WM_RBUTTONDOWN , "RollUpDownGui1")
WM_MBUTTONDOWN = 0x207
OnMessage(WM_MBUTTONDOWN , "ToggleOnTop")

;specify temp file for preview 
TempFileName = %TEMP%\Easycopy_screenshot_temp 
Return 
;############################################################################## 
;#############   End of AutoExecution-Section   ############################### 
;############################################################################## 


;############################################################################## 
;#############   Actions of GUI 1 - EasyCopy   ################################ 
;############################################################################## 

;#############   Build GUI 1 for Easy Copy   ################################## 
BuildGuiEasyCopy: 
  Gui, 1:Margin, 1, 1 
  Gui, 1:+ToolWindow 
  Gui, 1:Add, Button, xm Section gBtnCaptureScreen, &Screen 
  Gui, 1:Add, Button, ys gBtnCaptureWindow, &Window 
  Gui, 1:Add, Button, ys gBtnCaptureClientArea, &Client Area 
  Gui, 1:Add, Button, ys gBtnCaptureRegion, &Region 
  Gui, 1:Add, Button, ys gBtnRedoCapture, Re&do 
  Gui, 1:Add, Text, xm y+6 Section, Path: 
  Gui, 1:Add, Edit, ys-4 Right r1 w205 vEdtPath, %EdtPath% 
  Gui, 1:Add, Button, ys-5 gBtnBrowsePath, ... 
  Gui, 1:Add, Text, xm y+6 Section, File: 
  Gui, 1:Add, Edit, ys-4 r1 w232 vEdtFileName, %EdtFileName% 
  Gui, 1:Add, Checkbox, xm y+6 Section vChkShowPreview Checked%ChkShowPreview%, preview 
  Gui, 1:Add, Button, ys-5 vBtnSave gBtnSave Disabled, Save 
  Gui, 1:Add, Button, ys-5 vBtnPrint gBtnPrint Disabled, Print 
  Gui, 1:Add, Button, ys-5 gBtnOptions, Options 
  Gui, 1:Add, Button, ys-5 gBtnOpen, Open 
  Gui, 1:Add, Button, ys-5 vBtnEdit gBtnEdit Disabled, Edit  
  Gui, 1:Add, Picture, xm vPicPreview, 
  
  ShowOptions =
  If HideGuiOnStart
    {
      DetectHiddenWindows, On
      ShowOption = Hide 
    }
  IniRead, Pos_Gui1, %StartCenterIni%, EasyCopy, Pos_Gui1, x0 y0 
  WinnameGui1 = %EasyCopyWindowtitle% %Version% 
  Gui, 1:Show, %ShowOption% %Pos_Gui1%,%WinnameGui1% 

  ;get uniqueID of GUI for window roll up 
  WinGet, Gui1UniqueID, ID, %WinNameGui1% 
  GuiRolledUp := False 

  ;get Gui width and height for Resize of Preview 
  WinGetPos, , , Gui1Width, Gui1Height, ahk_id %Gui1UniqueID%
  DetectHiddenWindows, Off 
Return 

;#############   Read user defaults from ini   ################################ 
ReadDefaultsFromIni: 
  IniRead, EdtPath,        %StartCenterIni%, EasyCopy, EdtPath,        %PathProjects% 
  IniRead, EdtFileName,    %StartCenterIni%, EasyCopy, EdtFileName,    shot_##.jpg 
  IniRead, ChkShowPreview, %StartCenterIni%, EasyCopy, ChkShowPreview, 1 

  IniRead, ChkAutoNumber,  %StartCenterIni%, EasyCopy, ChkAutoNumber,  1 
  IniRead, EdtAutoNumber,  %StartCenterIni%, EasyCopy, EdtAutoNumber,  1 
  IniRead, ChkHideMouse,   %StartCenterIni%, EasyCopy, ChkHideMouse,   1 
  IniRead, ChkAllowRegionMove, %StartCenterIni%, EasyCopy, ChkAllowRegionMove, 0 
  IniRead, OpenAsThumbs,   %StartCenterIni%, EasyCopy, OpenAsThumbs,   1 

  IniRead, CobFrameColor, %StartCenterIni%, EasyCopy, CobFrameColor, 00FFFF Yellow 
  IniRead, EdtFrameThickness, %StartCenterIni%, EasyCopy, EdtFrameThickness, 2 
  IniRead, ChkDrawGoldenCut, %StartCenterIni%, EasyCopy, ChkDrawGoldenCut, 1 
  IniRead, CobGoldenCutColor, %StartCenterIni%, EasyCopy, CobGoldenCutColor, FF00FF Fuchsia 
  IniRead, CobGoldenCutStyle, %StartCenterIni%, EasyCopy, CobGoldenCutStyle, 1 dash 
  IniRead, ChkDrawCrossLines, %StartCenterIni%, EasyCopy, ChkDrawCrossLines, 1 
  IniRead, CobCrossLinesColor, %StartCenterIni%, EasyCopy, CobCrossLinesColor, 0000FF Red 
  IniRead, CobCrossLinesStyle, %StartCenterIni%, EasyCopy, CobCrossLinesStyle, 2 dot 

  IniRead, ShortCutCaptureScreen,  %StartCenterIniFile%, EasyCopy, ShortCutCaptureScreen, !1 
  IniRead, ShortCutCaptureWindow, %StartCenterIniFile%, EasyCopy, ShortCutCaptureWindow, !2 
  IniRead, ShortCutCaptureClientArea, %StartCenterIniFile%, EasyCopy, ShortCutCaptureClientArea, !3 
  IniRead, ShortCutCaptureRegion,    %StartCenterIniFile%, EasyCopy, ShortCutCaptureRegion, !4 
  IniRead, ShortCutRedoCapture,   %StartCenterIniFile%, EasyCopy, ShortCutRedoCapture, !5 

  IniRead, CobColorDepth, %StartCenterIni%, EasyCopy, CobColorDepth, No change 
  IniRead, ChkSwapBlackAndWhite, %StartCenterIni%, EasyCopy, ChkSwapBlackAndWhite, 0 
  IniRead, ChkGrayScale, %StartCenterIni%, EasyCopy, ChkGrayScale, 0 
  IniRead, ChkApplySharpen, %StartCenterIni%, EasyCopy, ChkApplySharpen, 0 
  IniRead, EdtSharpen, %StartCenterIni%, EasyCopy, EdtSharpen, 33 
  IniRead, ChkApplyContrast, %StartCenterIni%, EasyCopy, ChkApplyContrast, 0 
  IniRead, EdtContrast, %StartCenterIni%, EasyCopy, EdtContrast, 33 

  IniRead, CobTifCompression, %StartCenterIni%, EasyCopy, CobTifCompression, Default 
  IniRead, EdtJpgQuality, %StartCenterIni%, EasyCopy, EdtJpgQuality, 75 
  IniRead, CopytoClipboard, %StartCenterIni%, EasyCopy,CopytoClipboard, 0 

  IniRead, HideGuiOnStart, %StartCenterIni%, EasyCopy, HideGuiOnStart, 0    
  IniRead, HideGuiAfterCapture, %StartCenterIni%, EasyCopy, HideGuiAfterCapture, 0 
  IniRead, ShowGuiWithSingleCLick, %StartCenterIni%, EasyCopy,ShowGuiWithSingleCLick, 1 
Return 

;#############   Activates user defined hotkeys   ############################# 
ActivateHotKeys: 
  Hotkey, %ShortCutCaptureScreen%,     BtnCaptureScreen, On 
  Hotkey, %ShortCutCaptureWindow%,     BtnCaptureWindow, On 
  Hotkey, %ShortCutCaptureClientArea%, BtnCaptureClientArea, On 
  Hotkey, %ShortCutCaptureRegion%,     BtnCaptureRegion, On 
  Hotkey, %ShortCutRedoCapture%,       BtnRedoCapture, On 
Return 

;#############   Browse to Path to save image file   ########################## 
BtnBrowsePath: 
  Gui, 1: Submit, NoHide 
  Gui, 1:+OwnDialogs 
  FileSelectFolder, SelectedDir, *%EdtPath%, 3, Select Path to save image file 
  if SelectedDir 
      GuiControl, 1: ,EdtPath, %SelectedDir% 
  ;right justiefy the edit controls content if longer then control length
  SendMessage, 0xB1, 500, 500, Edit1 ; 0xB1 is EM_SETSEL
return 

;#############   Close Gui 1  and save settings   ############################# 
GuiEscape: 
GuiClose: 
  Gui, 1: Submit, NoHide
  IniWrite, %EdtPath%,        %StartCenterIni%, EasyCopy, EdtPath 
  IniWrite, %EdtFileName%,    %StartCenterIni%, EasyCopy, EdtFileName 
  IniWrite, %ChkShowPreview%, %StartCenterIni%, EasyCopy, ChkShowPreview 
  Gui, 1:Show, Hide
  DetectHiddenWindows, On
  WinGetPos, PosX, PosY, , , ahk_id %Gui1UniqueID%
  IniWrite, x%PosX% y%PosY%, %StartCenterIni%, EasyCopy, Pos_Gui1 
  ExitApp 
Return 

;#############   Show / Hide Gui1 from tray menu ( or hide by rollup )  ###### 
RollUpDownGui1(wParam, lParam, msg, hwnd)
  {
    Global Gui1UniqueID, GuiRolledUp, ShowGuiWithSingleCLick
    If (ShowGuiWithSingleCLick and msg = "0x204")
        Gui, 1:Hide
    Else
      {
        WM_NCMOUSEMOVE = 0xA0
        If ( GuiRolledUp and msg = WM_NCMOUSEMOVE)
          {
            Gui, 1:Show, AutoSize
            OnMessage(WM_NCMOUSEMOVE , "")
          }
        Else If ( !GuiRolledUp and msg = "0x204")
          {
            WinMove, ahk_id %Gui1UniqueID%,,,,, 22
            OnMessage(WM_NCMOUSEMOVE , "RollUpDownGui1")
          }
        Else 
            Return
        GuiRolledUp := not GuiRolledUp
      }
  }

;#############   Toggle Show/hide of GUI from Tray   ##########################
TrayShowGui: 
  IfWinExist, ahk_id %Gui1UniqueID% 
       Gui, 1:Hide 
  Else 
      Gui, 1:Show, AutoSize
Return 

;#############   Open destination folder in explorer   ######################## 
BtnOpen: 
  Gui, 1: Submit, NoHide 
  If OpenAsThumbs 
      Run, %ExeCapture% "%EdtPath%" /thumbs 
  Else 
      Run, explorer /e`,"%EdtPath%" 
Return 

;#############   toggle Gui 1 stay on top   ############################## 
ToggleOnTop(wParam, lParam, msg, hwnd)
  {
    Global Gui1UniqueID
    WinGet, ExStyle, ExStyle, ahk_id %Gui1UniqueID%
    WinGetTitle, CurrentTitle , ahk_id %Gui1UniqueID%
    If (ExStyle & 0x8) ; 0x8 is WS_EX_TOPMOST
      {
        Gui, 1: -AlwaysOnTop
        StringTrimRight, CurrentTitle, CurrentTitle, 8
        WinSetTitle, ahk_id %Gui1UniqueID%, , %CurrentTitle%
      }
    Else
      { 
        Gui, 1: +AlwaysOnTop
        WinSetTitle, ahk_id %Gui1UniqueID%, , %CurrentTitle% - *AOT* 
      }
  }

;############################################################################## 
;#############   Actions of GUI 2 - Options   ################################# 
;############################################################################## 

;#############   Build Gui 2 - Options   ###################################### 
BtnOptions: 
  ;color palette for combobox of line colors in BBGGRR 
  ColorPalette = 
    (LTrim Join| 
      000000 Black 
      C0C0C0 Silver 
      808080 Gray 
      FFFFFF White 
      000080 Maroon 
      0000FF Red 
      800080 Purple 
      FF00FF Fuchsia 
      008000 Green 
      00FF00 Lime 
      008080 Olive 
      00FFFF Yellow 
      800000 Navy 
      FF0000 Blue 
      808000 Teal 
      FFFF00 Aqua 
    ) 

  ;de-activate old hotkeys 
  Hotkey, %ShortCutCaptureScreen%,    Off 
  Hotkey, %ShortCutCaptureWindow%,    Off 
  Hotkey, %ShortCutCaptureClientArea%,Off 
  Hotkey, %ShortCutCaptureRegion%,    Off 
  Hotkey, %ShortCutRedoCapture%,      Off 

  ;Set no max/min icon, small border, and on top of Gui 1 
  Gui, 2: +ToolWindow +Owner1 
  Gui, 1: +Disabled 

  Gui, 2:Add, Tab, xm w360 r7 Section, Misc|Lines|ShortCuts|Quality|Save|ShowHide 
    Gui, 2:Tab, Misc 
      Gui, 2:Add,Checkbox,xs+10 ys+30 vChkAutoNumber gApplyChkStatusGui2 Checked%ChkAutoNumber%,Use # in filename to number files`nautomatically. Start with number: 
      Gui, 2:Add,Edit,x+5 ys+35 r1 Right Number w100 vEdtAutoNumber, 
      Gui, 2:Add,UpDown, Range1-999999999999, %EdtAutoNumber% 
      Gui, 2:Add,Checkbox, xs+10 ys+70 vChkHideMouse Checked%ChkHideMouse%, Hide mouse pointer 
      Gui, 2:Add,Checkbox, xs+10 ys+90 vChkAllowRegionMove Checked%ChkAllowRegionMove%, Allow to move region with middle mouse button.`nRight mouse button will finish capturing. 
      Gui, 2:Add,Checkbox, xs+10 ys+122 vOpenAsThumbs Checked%OpenAsThumbs%, "Open" button shows Irfanview thumbnails`n instead of explorer folder 
    Gui, 2:Tab, Lines 
      Gui, 2:Add,Text,xs+10 ys+30,Frame to capture region 
      Gui, 2:Add,Text,xs+30 ys+50, Color: 
      Gui, 2:Add,ComboBox,x+10 ys+46 w100 vCobFrameColor,%ColorPalette% 
      Gui, 2:Add,Text,xs+180 ys+50, Thickness: 
      Gui, 2:Add,Edit,xs+240 ys+46 w35 r1 Number Limit2 vEdtFrameThickness, 
      Gui, 2:Add,UpDown, Range1-10, %EdtFrameThickness% 
      
      Gui, 2:Add,Checkbox,xs+10 ys+75 vChkDrawGoldenCut gApplyChkStatusGui2 Checked%ChkDrawGoldenCut%,Draw lines for golden cut 
      Gui, 2:Add,Text,xs+30 ys+95, Color: 
      Gui, 2:Add,ComboBox,x+10 ys+91 w100 vCobGoldenCutColor,%ColorPalette% 
      Gui, 2:Add,Text,xs+180 ys+95, Style: 
      Gui, 2:Add,ComboBox,xs+240 ys+91 w90 vCobGoldenCutStyle,0 solid|1 dash|2 dot|3 dashdot|4 dashdotdot 

      Gui, 2:Add,Checkbox,xs+10 ys+120 vChkDrawCrossLines gApplyChkStatusGui2 Checked%ChkDrawCrossLines%,Draw cross lines 
      Gui, 2:Add,Text,xs+30 ys+140, Color: 
      Gui, 2:Add,ComboBox,x+10 ys+136 w100 vCobCrossLinesColor,%ColorPalette% 
      Gui, 2:Add,Text,xs+180 ys+140, Style: 
      Gui, 2:Add,ComboBox,xs+240 ys+136 w90 vCobCrossLinesStyle,0 solid|1 dash|2 dot|3 dashdot|4 dashdotdot 
    Gui, 2:Tab, ShortCuts 
      Gui, 2:Add,Text,   xs+10  ys+30, ShortCut to capture screen 
      Gui, 2:Add,Hotkey, xs+160 ys+26  w190 vShortCutCaptureScreen,%ShortCutCaptureScreen% 
      Gui, 2:Add,Text,   xs+10  ys+55, ShortCut to capture window 
      Gui, 2:Add,Hotkey, xs+160 ys+51  w190 vShortCutCaptureWindow,%ShortCutCaptureWindow% 
      Gui, 2:Add,Text,   xs+10  ys+80,ShortCut to capture client area 
      Gui, 2:Add,Hotkey, xs+160 ys+76  w190 vShortCutCaptureClientArea,%ShortCutCaptureClientArea% 
      Gui, 2:Add,Text,   xs+10  ys+105,ShortCut to capture region 
      Gui, 2:Add,Hotkey, xs+160 ys+101 w190 vShortCutCaptureRegion,%ShortCutCaptureRegion% 
      Gui, 2:Add,Text,   xs+10  ys+130,ShortCut to redo capture 
      Gui, 2:Add,Hotkey, xs+160 ys+126 w190 vShortCutRedoCapture,%ShortCutRedoCapture% 
    Gui, 2:Tab, Quality 
      Gui, 2:Add,Text,     xs+10 ys+30, Change color depth of image to BitsPerPixel 
      Gui, 2:Add,ComboBox, xs+220 ys+26 w125 vCobColorDepth , No change|1 (2 colors)|4 (16 colors)|8 (256 colors)|24 (16777216 colors) 
      Gui, 2:Add,Checkbox, xs+10 ys+55 vChkSwapBlackAndWhite Checked%ChkSwapBlackAndWhite%, Swap black and white color 
      Gui, 2:Add,Checkbox, xs+10 ys+80 vChkGrayScale Checked%ChkGrayScale%, Convert image to grayscale 
      Gui, 2:Add,Checkbox, xs+10 ys+105 vChkApplySharpen gApplyChkStatusGui2 Checked%ChkApplySharpen%, Apply sharpen filter, with value 
      Gui, 2:Add,Edit, xs+180 ys+101 vEdtSharpen Right Number Limit3 w30, %EdtSharpen% 
      Gui, 2:Add,Checkbox, xs+10 ys+130 vChkApplyContrast gApplyChkStatusGui2 Checked%ChkApplyContrast%, Apply contrast, with value 
      Gui, 2:Add,Edit, xs+180 ys+126 vEdtContrast Right Number Limit3 w30, %EdtContrast% 
    Gui, 2:Tab, Save 
      Gui, 2:Add,Text, xs+10 ys+30, TIF save compression 
      Gui, 2:Add,ComboBox, xs+120 ys+26 w90 vCobTifCompression, Default|0 = None|1 = LZW|2 = Packbits|3 = Fax3|4 = Fax4|5 = Huffman|6 = JPG|7 = ZIP 

      Gui, 2:Add,Text, xs+10 ys+55 , JPG save quality 
      Gui, 2:Add,Text, vTxt1SldJpgQ, Small`nSize 
      Gui, 2:Add,Text, vTxt2SldJpgQ, High`nQuality 
      Gui, 2:Add,Slider, xs+55 ys+75 Buddy1Txt1SldJpgQ Buddy2Txt2SldJpgQ AltSubmit vSldJpgQuality gSldJpgQuality, %EdtJpgQuality% 
      Gui, 2:Add,Edit, xs+230 ys+75 vEdtJpgQuality gEdtJpgQuality Right Number Limit3 r1 w45, 
      Gui, 2:Add,UpDown, Range1-100, %EdtJpgQuality% 
      Gui, 2:Add,Checkbox, xs+10 ys+120 vCopytoClipboard Checked%CopytoClipboard%, Copy screenshot also to clipboard 
    Gui, 2:Tab, ShowHide 
      Gui, 2:Add,Checkbox,xs+10 ys+30 vHideGuiOnStart Checked%HideGuiOnStart%,Hide Gui on startup 
      Gui, 2:Add,Checkbox, xs+10 ys+50 vHideGuiAfterCapture Checked%HideGuiAfterCapture%, Hide Gui after capture (only if preview is off) 
      Gui, 2:Add,Checkbox, xs+10 ys+70 vShowGuiWithSingleCLick Checked%ShowGuiWithSingleCLick%, Single click on tray icon or right click on titlebar shows or hides Gui 
  Gui, 2:Tab 

  Gui, 2:Add,Button,xm Section gApplyOptions,Apply 
  Gui, 2:Add,Button,ys gCancelOptions,Cancel 

  ;select previous settings in comboboxes 
  GuiControl, 2:ChooseString, CobFrameColor, %CobFrameColor% 
  GuiControl, 2:ChooseString, CobGoldenCutColor, %CobGoldenCutColor% 
  GuiControl, 2:ChooseString, CobGoldenCutStyle, %CobGoldenCutStyle% 
  GuiControl, 2:ChooseString, CobCrossLinesColor, %CobCrossLinesColor% 
  GuiControl, 2:ChooseString, CobCrossLinesStyle, %CobCrossLinesStyle% 
  GuiControl, 2:ChooseString, CobColorDepth, %CobColorDepth% 
  GuiControl, 2:ChooseString, CobTifCompression, %CobTifCompression% 

  ;set controls to enable/disable, depending on checkbox status 
  GoSub, ApplyChkStatusGui2 

  ;get previous position and show Gui 
  IniRead, Pos_Gui2, %StartCenterIni%, EasyCopy, Pos_Gui2, %A_Space% 
  WinnameGui2 = %EasyCopyWindowtitle% - Options 
  Gui, 2:Show, %Pos_Gui2%, %WinnameGui2% 
return 

;#############   JPGQ slider is moved   ####################################### 
SldJpgQuality: 
  ;adjust edit field 
  GuiControl, 2:, EdtJpgQuality, %SldJpgQuality% 
return 
  
;#############   JPGQ edit field gets chnaged   ############################### 
EdtJpgQuality: 
  ;get value 
  GuiControlGet, EdtJpgQuality, 2:
  ;enforce limit 1 - 100 and set slider position 
  If EdtJpgQuality > 100 
    { 
      GuiControl, 2:, EdtJpgQuality, 100 
      GuiControl, 2:, SldJpgQuality, 100 
    } 
  Else If  EdtJpgQuality < 0 
    { 
      GuiControl, 2:, EdtJpgQuality, 0 
      GuiControl, 2:, SldJpgQuality, 0 
    } 
  Else 
      GuiControl, 2:, SldJpgQuality, %EdtJpgQuality% 
return 

;#############   Apply status to controls depending on checkbox   ############# 
ApplyChkStatusGui2: 
  ;Get options 
  GuiControlGet, ChkAutoNumber, 2:
  GuiControlGet, ChkDrawGoldenCut, 2:
  GuiControlGet, ChkDrawCrossLines, 2:
  GuiControlGet, ChkApplySharpen, 2:
  GuiControlGet, ChkApplyContrast, 2:

  GuiControl, 2:Enable%ChkAutoNumber%     , EdtAutoNumber 
  GuiControl, 2:Enable%ChkDrawGoldenCut%  , CobGoldenCutColor 
  GuiControl, 2:Enable%ChkDrawGoldenCut%  , CobGoldenCutStyle 
  GuiControl, 2:Enable%ChkDrawCrossLines% , CobCrossLinesColor 
  GuiControl, 2:Enable%ChkDrawCrossLines% , CobCrossLinesStyle 
  GuiControl, 2:Enable%ChkApplySharpen%   , EdtSharpen 
  GuiControl, 2:Enable%ChkApplyContrast%  , EdtContrast 
return 

;#############   Apply and save options   ##################################### 
ApplyOptions: 
  ;Get options 
  Gui, 2: Submit, NoHide 

  If ShowGuiWithSingleCLick 
     Menu, Tray, Click, 1
  Else
     Menu, Tray, Click, 2
    
  ;store options to ini 
  IniWrite, %ChkAutoNumber%, %StartCenterIni%, EasyCopy, ChkAutoNumber 
  IniWrite, %EdtAutoNumber%, %StartCenterIni%, EasyCopy, EdtAutoNumber 
  IniWrite, %ChkHideMouse%, %StartCenterIni%, EasyCopy, ChkHideMouse 
  IniWrite, %ChkAllowRegionMove%, %StartCenterIni%, EasyCopy, ChkAllowRegionMove 
  IniWrite, %OpenAsThumbs%, %StartCenterIni%, EasyCopy, OpenAsThumbs 

  IniWrite, %CobFrameColor%, %StartCenterIni%, EasyCopy, CobFrameColor 
  IniWrite, %EdtFrameThickness%, %StartCenterIni%, EasyCopy, EdtFrameThickness 
  IniWrite, %ChkDrawGoldenCut%, %StartCenterIni%, EasyCopy, ChkDrawGoldenCut 
  IniWrite, %CobGoldenCutColor%, %StartCenterIni%, EasyCopy, CobGoldenCutColor 
  IniWrite, %CobGoldenCutStyle%, %StartCenterIni%, EasyCopy, CobGoldenCutStyle 
  IniWrite, %ChkDrawCrossLines%, %StartCenterIni%, EasyCopy, ChkDrawCrossLines 
  IniWrite, %CobCrossLinesColor%, %StartCenterIni%, EasyCopy, CobCrossLinesColor 
  IniWrite, %CobCrossLinesStyle%, %StartCenterIni%, EasyCopy, CobCrossLinesStyle 

  IniWrite, %ShortCutCaptureScreen%,  %StartCenterIniFile%, EasyCopy, ShortCutCaptureScreen 
  IniWrite, %ShortCutCaptureWindow%, %StartCenterIniFile%, EasyCopy, ShortCutCaptureWindow 
  IniWrite, %ShortCutCaptureClientArea%, %StartCenterIniFile%, EasyCopy, ShortCutCaptureClientArea 
  IniWrite, %ShortCutCaptureRegion%,    %StartCenterIniFile%, EasyCopy, ShortCutCaptureRegion 
  IniWrite, %ShortCutRedoCapture%,   %StartCenterIniFile%, EasyCopy, ShortCutRedoCapture 

  IniWrite, %CobColorDepth%, %StartCenterIni%, EasyCopy, CobColorDepth 
  IniWrite, %ChkSwapBlackAndWhite%, %StartCenterIni%, EasyCopy, ChkSwapBlackAndWhite 
  IniWrite, %ChkGrayScale%, %StartCenterIni%, EasyCopy, ChkGrayScale 
  IniWrite, %ChkApplySharpen%, %StartCenterIni%, EasyCopy, ChkApplySharpen 
  IniWrite, %EdtSharpen%, %StartCenterIni%, EasyCopy, EdtSharpen 
  IniWrite, %ChkApplyContrast%, %StartCenterIni%, EasyCopy, ChkApplyContrast 
  IniWrite, %EdtContrast%, %StartCenterIni%, EasyCopy, EdtContrast 

  IniWrite, %CobTifCompression%, %StartCenterIni%, EasyCopy, CobTifCompression 
  IniWrite, %EdtJpgQuality%, %StartCenterIni%, EasyCopy, EdtJpgQuality 
  IniWrite, %CopytoClipboard%, %StartCenterIni%, EasyCopy, CopytoClipboard 

  IniWrite, %HideGuiOnStart%, %StartCenterIni%, EasyCopy, HideGuiOnStart 
  IniWrite, %HideGuiAfterCapture%, %StartCenterIni%, EasyCopy, HideGuiAfterCapture 
  IniWrite, %ShowGuiWithSingleCLick%, %StartCenterIni%, EasyCopy, ShowGuiWithSingleCLick 
  GoSub, CancelOptions 
return 

;#############   Close GUI 2 - Options   ###################################### 
2GuiEscape: 
2GuiClose: 
CancelOptions: 
  ;activate hotkeys 
  GoSub, ActivateHotKeys 

  ;store current position and close gui 
  WinGetPos, PosX, PosY, SizeW, SizeH, %WinnameGui2% 
  IniWrite, x%PosX% y%PosY%, %StartCenterIni%, EasyCopy, Pos_Gui2 
  
  ;close Options GUI 
  Gui, 2: Destroy 
  
  ;enable GUI 1 and bring it to front again 
  Gui, 1: -Disabled 
  Gui, 1: Show 
return 

;############################################################################## 
;#############   Capture Screenshot   ######################################### 
;############################################################################## 

;#############   Redo previous capture   ###################################### 
BtnRedoCapture: 
  If RedoBuffer is not space 
      If IsLabel(RedoBuffer) 
          GoSub, %RedoBuffer% 
Return 

;#############   Capture full screen   ######################################## 
BtnCaptureScreen: 
  ;memorize this as last action 
  RedoBuffer = BtnCaptureScreen 

  ;AreaID ( 0 = screen, 1 = Window, 2 = client area)
  AreaID = 0
  
  ;start capture process
  GoSub, StartAreaCaptureProcess
Return 

;#############   Capture active window   ###################################### 
BtnCaptureWindow: 
  RedoBuffer = BtnCaptureWindow 
  AreaID = 1
  GoSub, StartAreaCaptureProcess
Return 

;#############   Capture client area of window   ############################## 
BtnCaptureClientArea: 
  RedoBuffer = BtnCaptureClientArea 
  AreaID = 2
  GoSub, StartAreaCaptureProcess
Return 

;#############   Start Capture Process   ######################################
StartAreaCaptureProcess:
  ;get data from GUI 
  Gui, 1:Submit, NoHide

  If not GetFileName(ChkShowPreview, ChkAutoNumber)
    Return

  ;hide GUI if file name is found
  Gui, 1:Hide 

  ;activate escape sequence 
  HotKey, $Esc, EscapeScreenShot, On 
  EscapeSequence := True 
  
  ;wait for window selection if AreaID >= 1  
  If AreaID
    {
      ;wait for window to be selected 
      KeyWait, LButton, D 
      
      ;wait for Lbutton to be release (otherwise window will be moved, when mouse gets hidden) 
      KeyWait, LButton 
    }

  ;capture options for area
  CaptureOptions = /capture=%AreaID%
  
  ;do screenshot capture if escape sequence hasn't be activated yet
  If EscapeSequence 
      GoSub, CaptureScreenShot 

  ;turn off hotkey for escape sequence if it hasn't been yet
  HotKey, $Esc, Off 
Return

;#############   ESC hotkey to aboard screenshots   ########################### 
EscapeScreenShot: 
  ;turn off hotkey 
  HotKey, $Esc, Off 

  ;set escape sequence 
  EscapeSequence := False 

  ;show Gui again 
  Gui, 1:Show, AutoSize 
Return 

;#############   Capture screenshot   ######################################### 
CaptureScreenShot: 
  ;if hide mouse is wanted memorize current position and move it to lower right corner 
  If ChkHideMouse 
    { 
      MouseGetPos, MhideX, MhideY 
      MouseMove, %ScreenWidth%, %ScreenHeight% , 0 
    } 
    
  ;add rest of options for screenshot 
  GoSub, AddCaptureOptions 

  RunWait, 
    (LTrim Join`s 
      %ExeCapture% 
      %CaptureOptions% 
      /convert="%FileNameForImage%" 
    ) 

  ;if mouse was hidden, move it back again 
  If ChkHideMouse 
      MouseMove, %MhideX%, %MhideY% , 0 

  ;show preview or give feedback 
  If ChkShowPreview 
    { 
      ;add preview to GUI 
      GuiControl, 1:, PicPreview, %FileNameForImage% 

      ;adjust size of Picture to fit initial GuiWidth 
      GuiControlGet, PicPreview, 1:Pos 
      GuiControl, 1:Move, PicPreview, % "w" Gui1Width "h" PicPreviewH*Gui1Width/PicPreviewW ;% 

      ;enable Buttons and memorize filename 
      GuiControl, 1:Enable , BtnSave 
      GuiControl, 1:Enable , BtnPrint 
      PreViewFileName = %FileNameForImage% 
    } 
  Else ;no preview wanted 
    { 
      ;give feedback 
      LastSavedFile = %FileNameForImage% 
      GuiControl, 1:Enable , BtnEdit
      ToolTip, ScreenShot saved as`n%FileNameForImage% 
      SetTimer, RemoveToolTip, 2000 

      ;empty vars, controls and disable buttons 
      PreViewFileName = 
      FileNameForImage = 
      GuiControl, 1: , PicPreview, 
      GuiControl, 1:Disable , BtnSave 
      GuiControl, 1:Disable , BtnPrint 
    } 

  ;show Gui if wanted, autosize to fit preview (added, new or delted) 
  If ( HideGuiAfterCapture = 0 Or ChkShowPreview = 1) 
      Gui, 1:Show, AutoSize 
Return

;#############   Add options for screenshot   ################################# 
AddCaptureOptions: 
  If ( CobColorDepth <> "No change" ) 
    { 
      StringSplit, Value, CobColorDepth, %A_Space% 
      CaptureOptions = %CaptureOptions% /bpp=%Value1% 
    } 
  If ChkSwapBlackAndWhite 
      CaptureOptions = %CaptureOptions% /swap_bw 
  If ChkGrayScale 
      CaptureOptions = %CaptureOptions% /gray 
  If ChkApplySharpen 
      CaptureOptions = %CaptureOptions% /sharpen=%EdtSharpen% 
  If ChkApplyContrast 
      CaptureOptions = %CaptureOptions% /contrast=%EdtContrast% 
  If ( CobTifCompression <> "Default" AND OutExtension = "tif" ) 
    { 
      StringSplit, Value, CobTifCompression, %A_Space% 
      CaptureOptions = %CaptureOptions% /tifc=%Value1% 
    } 
  If ( OutExtension = "jpg" ) 
      CaptureOptions = %CaptureOptions% /jpgq=%EdtJpgQuality% 
  If CopyToClipboard 
      CaptureOptions = %CaptureOptions% /clipcopy 
Return 

;#############   Get File Name for image  #####################################
GetFileName(ChkShowPreview, ChkAutoNumber)
{  
  global EdtFileName, EdtPath, EdtAutoNumber
         , FileNameForImage, PreViewFileName
         , TempFileName, OutExtension
  
  ;return if no filename is given
  If EdtFileName is space
    {
      MsgBox, 48, Problem , No filename is given.
      Return 0
    }

  ;get extension of file to be saved 
  SplitPath, EdtFileName, , , OutExtension 

  ;if preview is wanted 
  If ChkShowPreview 
    { 
      ;remove previous preview file 
      FileDelete, %PreViewFileName% 
      
      ;If no extention is found, use JPG 
      If OutExtension is space 
          OutExtension = jpg 
      
      ;specify temp file for preview 
      FileNameForImage = %TempFileName%.%OutExtension% 
    } 
  ; no preview wanted - get file name for image
  Else If ChkAutoNumber
    {
      FileNameForImage := GetAvailableFileName(EdtFileName, EdtPath, EdtAutoNumber)
      If (FileNameForImage = 0 )
        {
          MsgBox, 48, Problem to find file name for screenshot,%ErrorLevel%`nNo screenshot taken or saved.
          Return 0
        }
    }
  Else If EdtPath is not space
    {
      StringRight, LastChar, EdtPath, 1
      If ( LastChar <> "\" )
        EdtPath = %EdtPath%\
      If ( InStr(FileExist(EdtPath), "D") = 0 )
        {
          MsgBox, 48, Problem, The given path >%EdtPath%< doesn't exist.
          Return 0
        }
      FileNameForImage := EdtPath . EdtFileName  
    }
  Else
      FileNameForImage := EdtFileName
  Return 1
}

;#############   Get next free/available File Name   ##########################
GetAvailableFileName( GivenFileName, GivenPath = "", StartID = 1 )
{ 
  ;check if GivenPath exist and add "\" if necessary
  If GivenPath is not space
    {
      StringRight, LastChar, GivenPath, 1
      If ( LastChar <> "\" )
        GivenPath = %GivenPath%\
      If ( InStr(FileExist(GivenPath), "D") = 0 )
        {
          ErrorLevel = The given path >%GivenPath%< doesn't exist.
          Return 0
        }
    }

  ;check if StartID is reasonable
  If ( StartID < 0 Or Mod(StartID, 1) <> 0 )
    {
      ErrorLevel =
        (LTrim
           The StartID >%StartID%< is smaller then zero or not an integer.
           It has to be a positive integer.
        )
      Return 0
    }

  ;split GivenFileName with #
  StringSplit, NameArray, GivenFileName, #
  
  ;if GivenFileName doesn't contain # ...
  If NameArray0 < 2
    {
      ;check if GivenFileName exists
      If FileExist(GivenPath . GivenFileName)
        {
          ErrorLevel =
            (LTrim
              The given file >%GivenFileName%< does exist
              in path >%GivenPath%<.
              (if path is empty, it's the path of the script/exe)
            )
          Return 0
        }
      Else
          Return GivenPath . GivenFileName
    }

  ;check if StartID isn't too large
  If ( StrLen(StartID) > NameArray0 - 1 )
    {
      ErrorLevel =
        (LTrim
           The StartID >%StartID%< is too large
           for the filename >%GivenFileName%<.
        )
      Return 0
    }
  
  ;Search from StartID ...
  Loop 
    { 
      Number := A_Index + StartID - 1
             
      ;untill number is too large ...
      If ( StrLen(Number) > NameArray0 - 1 )
        {
          ErrorLevel =
            (LTrim
              All files exist for >%GivenFileName%<
              with all # between %StartID% and %Number%.
            )
          Return 0
        }

      ;otherwise fill number with leading zeros
      Loop, % NameArray0 - 1 - StrLen(Number) ;%
          Number = 0%Number% 
      
      ;split number in an array
      StringSplit, NumberArray, Number
      
      ;mix and concatenate the names array with the numbers array
      FileName =
      Loop, %NameArray0%
          FileName := FileName . NameArray%A_Index% . NumberArray%A_Index%
      
      ;check if GivenFileName doesn't exist
      If not FileExist(GivenPath . FileName)
          Return GivenPath . FileName
     } 
}

;############################################################################## 
;#############   Save or Print Previews   Edit last saved file    ############# 
;############################################################################## 

;#############   Save preview   ############################################### 
BtnSave: 
  ;get path and filename 
  Gui, 1:Submit, NoHide 

  ;check if preview file still exists 
  If FileExist(PreViewFileName) 
    { 
      If GetFileName(0, ChkAutoNumber)
        {
          ;copy preview image to destination image with overwrite 
          FileCopy, %PreViewFileName%, %FileNameForImage% , 1 
          LastSavedFile= %FileNameForImage% 
          GuiControl, 1:Enable , BtnEdit
          ;give feedback 
          ToolTip, ScreenShot saved as`n%FileNameForImage% 
        } 
    } 
  Else  ;preview file doesn't exist 
    GoSub, NoPreviewFileFound
     
  ;remove Feedback after 2 sec 
  SetTimer, RemoveToolTip, 2000 
Return 

NoPreviewFileFound:
      ;give feedback 
      ToolTip, File of ScreenShot PreView doesn't exist`n%PreViewFileName% 
      
      ;empty vars, controls and disable buttons 
      PreViewFileName = 
      FileNameForImage = 
      GuiControl, 1: , PicPreview, 
      GuiControl, 1:Disable , BtnSave 
      GuiControl, 1:Disable , BtnPrint 
      
      ;autosize Gui to fit removed preview 
      Gui, 1:Show, AutoSize 
Return

;#############   Print preview   ############################################### 
BtnPrint: 
  ;check if preview file still exists 
  If FileExist(PreViewFileName) 
    { 
      ;print preview image on default printer 
      RunWait, 
        (Join`s 
          %ExeCapture% 
          %PreViewFileName% 
          /print 
        ) 
      ;give feedback 
      ToolTip, ScreenShot printed on default Printer 
    } 
  Else  ;preview file doesn't exist 
    GoSub, NoPreviewFileFound

  ;remove Feedback after 2 sec 
  SetTimer, RemoveToolTip, 2000 
Return 

;#############   Edit last saved file   ####################################### 
BtnEdit: 
  Run, %ExeCapture% %LastSavedFile% 
Return 

;#############   Remove Feedback from Screen   ################################ 
RemoveToolTip: 
  SetTimer, RemoveToolTip, Off 
  ToolTip 
Return 

;############################################################################## 
;#############   Capture Region   ############################################# 
;############################################################################## 

;#############   Prepare region screenshot   ################################## 
BtnCaptureRegion: 
  ;get data from GUI 
  Gui, 1:Submit, NoHide

  If not GetFileName(ChkShowPreview, ChkAutoNumber)
    Return

  ;hide GUI 
  Gui, 1:Hide 

  ;get colors for frame and lines and combine them to 0x00BBGGRR 
  StringSplit, Value, CobFrameColor, %A_Space% 
  frame_c  = 0x00%Value1% 
  StringSplit, Value, CobGoldenCutColor, %A_Space% 
  lineGC_c = 0x00%Value1% 
  StringSplit, Value, CobCrossLinesColor, %A_Space% 
  line_c   = 0x00%Value1% 

  ;get line styles 
  StringSplit, Value, CobGoldenCutStyle, %A_Space% 
  lineGC_s = %Value1% 
  StringSplit, Value, CobCrossLinesStyle, %A_Space% 
  line_s   = %Value1% 
  
  ;specify line thicknesses and thresholds 
  lineGC_t = 1 
  line_t   = 1 
  ThresholdCrossLine = 50 
  ThresholdGoldenCutLine = 100 
  
  ;activate hotkeys (set to ON to ensure multiple uses) 
  HotKey, $Lbutton, DrawRegionFrame, On 
  HotKey, $Esc,     CleanUpRegionFrame, On 
Return 

;#############   Draw frame when mouse is draged   ############################ 
;When user clicks with Left-Mouse Button and drags, a frame is drawn on screen 
DrawRegionFrame: 
  ;set fast execution 
  SetBatchLines, -1 

  ;get starting position from mouse 
  MouseGetPos, MX, MY 
     
  ;create transparent GUI covering the whole screen 
  Gui, 3:Color, Black 
  Gui, 3:+Lastfound +AlwaysOnTop 
  WinSet, TransColor, Black 
  Gui, 3:-Caption 
  Gui, 3:Show, x0 y0 w%ScreenWidth% h%ScreenHeight% 

  ;retrieve the unique ID number (HWND/handle) of that window 
  WinGet, hw_frame, id 

  ;more information on the use functions in MSDN 
  ; http://msdn.microsoft.com/library/default.asp 
  
  ;Get handle to display device context (DC) for the client area of a specified window 
  hdc_frame := DllCall( "GetDC" 
                      , "uint", hw_frame ) 
                      
  ;create buffer to store old color data to remove drawn rectangles 
  hdc_buffer := DllCall( "gdi32.dll\CreateCompatibleDC" 
                       , "uint", hdc_frame ) 
  
  ;Create Bitmap buffer to remove drawn rectangles 
  hbm_buffer := DllCall( "gdi32.dll\CreateCompatibleBitmap" 
                       , "uint", hdc_frame 
                       , "int", ScreenWidth 
                       , "int", ScreenHeight ) 
  
  ;Select Bitmap buffer in buffer to remove drawn rectangles 
  DllCall( "gdi32.dll\SelectObject" 
         , "uint", hdc_buffer 
         , "uint", hbm_buffer ) 

  ;create a dummy rectangular region. 
  h_region := DllCall( "gdi32.dll\CreateRectRgn" 
                     , "int", 0 
                     , "int", 0 
                     , "int", 0 
                     , "int", 0 ) 

  ;specify the color of the frame. 
  h_brush := DllCall( "gdi32.dll\CreateSolidBrush" 
                    , "uint", frame_c ) 

  ;specify the style, thickness and color of the cross lines 
  h_pen := DllCall( "gdi32.dll\CreatePen" 
                   , "int", line_s 
                   , "int", line_t 
                   , "uint", line_c) 

  ;specify the style, thickness and color of the golden cut lines 
  h_penGC := DllCall( "gdi32.dll\CreatePen" 
                     , "int", lineGC_s 
                     , "int", lineGC_t 
                     , "uint", lineGC_c) 

  ;check continously if the mouse is draged while LButton is down and redraw frame. 
  Loop 
    { 
      ;redraw frame when LButton is still down 
      If GetKeyState("LButton", "P") 
        { 
          ;get current mouse position 
          MouseGetPos, MXend, MYend 
          
          ;redraw only if mouse moved to a different position 
          If ( MXend <> MXend_old 
               AND MYend <> MYend_old) 
            { 
              ;compute width and height of frame 
              w := abs(MX - MXend) 
              h := abs(MY - MYend) 
              
              ;find upper left corner 
              X := Min( MX, MXend ) 
              Y := Min( MY, MYend ) 
            
              ;remove old rectangle form screen and save/buffer screen below new rectangle 
              BufferAndRestoreRegion( X, Y, w, h ) 
              
              ;draw rectangle frame 
              DrawFrame( X, Y, w, h, EdtFrameThickness ) 
              
              ;if rectangle is large enough draw cross lines 
              If ( w > ThresholdCrossLine AND h > ThresholdCrossLine AND ChkDrawCrossLines ) 
                  DrawCross( X, Y, w, h ) 
              
              ;if rectangle large enough draw golden cut lines 
              If ( w > ThresholdGoldenCutLine AND h > ThresholdGoldenCutLine AND ChkDrawGoldenCut ) 
                  DrawGoldenCut( X, Y, w, h ) 
              
              ;memorize position 
              MXend_old = %MXend% 
              MYend_old = %MYend% 
              
              ;sleep to increase performance 
              Sleep, 50 
            } 
         }        
      Else   ;LButton is released 
          Break 
    } 
  ;if wanted activate new hotkeys to allow moving of frame 
  If ChkAllowRegionMove 
    { 
      ;Middle mouse button to move frame 
      HotKey, $Mbutton, MoveRegionFrame, On 

      ;Right mouse button to take region screenshot 
      HotKey, $Rbutton, CaptureRegion, On 
    } 
  Else ; moving of frame not wanted 
    { 
      ;take region screenshot 
      GoSub, CaptureRegion 
    } 
Return 

;#############   Capture region screenshot   ################################## 
CaptureRegion: 
  ;hide GUI, if it hasn't been done before (e.g. with redo)
  Gui, 1:Submit 

  ;get File Name (has to be redone due to redo)
  If not GetFileName(ChkShowPreview, ChkAutoNumber)
    Return

  ;remove buffer, handles, and GUI from memory, disable hotkeys 
  GoSub, CleanUpRegionFrame
  
  ;capture options for region
  CaptureOptions = /capture=0 /crop=(%X%,%Y%,%w%,%h%)
  
  ;do screenshot capture
  GoSub, CaptureScreenShot

  ;memorize this as last action, so that the exact same rectangle is taken with redo 
  RedoBuffer = CaptureRegion 
Return 

;#############   Return lower value of two values   ########################### 
Min( value1, value2 ) 
  { 
    If ( value1 < value2 ) 
        return value1 
    Else 
        return value2 
  } 

;#############   Move frame with mouse drag   ################################# 
; When user clicks with Middle-Mouse Button and drags, the frame is moved on the screen 
MoveRegionFrame: 
  ;set fast execution 
  SetBatchLines, -1 

  ;get starting position from mouse 
  MouseGetPos, MX, MY 
  
  ;memorize initial frame position 
  InitialX = %X% 
  InitialY = %Y% 

  ;check continously if the mouse is draged while MButton is down and redraw frame. 
  Loop 
    { 
      ;redraw frame when MButton is still down 
      If GetKeyState("MButton", "P") 
        { 
          ;get current mouse position 
          MouseGetPos, MXend, MYend 
          
          ;redraw only if mouse moved to a different position 
          If ( MXend <> MXend_old 
               AND MYend <> MYend_old) 
            { 
              ;find upper left corner 
              X := InitialX + MXend - MX 
              Y := InitialY + MYend - MY 
            
              ;remove old rectangle and save screen below new rectangle 
              BufferAndRestoreRegion( X, Y, w, h ) 
              
              ;draw rectangle frame 
              DrawFrame( X, Y, w, h, EdtFrameThickness ) 
              
              ;if rectangle large enough draw cross lines 
              If ( w > ThresholdCrossLine AND h > ThresholdCrossLine AND ChkDrawCrossLines ) 
                  DrawCross( X, Y, w, h ) 
              
              ;if rectangle large enough draw golden cut lines 
              If ( w > ThresholdGoldenCutLine AND h > ThresholdGoldenCutLine AND ChkDrawGoldenCut ) 
                  DrawGoldenCut( X, Y, w, h ) 
              
              ;memorize position 
              MXend_old = %MXend% 
              MYend_old = %MYend% 
              
              ;sleep to increase performance 
              Sleep, 50 
            } 
         }        
      Else   ;MButton is released 
          Break 
    } 
Return 

;#############   Remove handles and buffers from memory   ##################### 
;#############   Remove GUI from memory and disable hotkeys   ################# 
CleanUpRegionFrame: 
  DeleteObject( h_brush ) 
  DeleteObject( h_pen ) 
  DeleteObject( h_region ) 
  DeleteObject( hbm_buffer ) 
    
  DeleteDC( hdc_frame ) 
  DeleteDC( hdc_buffer ) 

  Gui, 3:Destroy 

  ;turn off hotkeys 
  HotKey, $Lbutton, Off 
  HotKey, $Esc,     Off 
  If ChkAllowRegionMove 
    { 
      HotKey, $Mbutton, Off 
      HotKey, $Rbutton, Off 
    } 

  ;if action is canceled show GUi again 
  If ( A_ThisHotkey = "$ESC" ) 
      Gui, 1:Show, AutoSize 
Return 

DeleteObject( p_object ) 
  { 
    ;deletes a logical pen, brush, font, bitmap, region, or palette, freeing all system resources 
    DllCall( "gdi32.dll\DeleteObject", "uint", p_object ) 
  } 

DeleteDC( p_dc ) 
  { 
    ;deletes the specified device context (DC). 
    DllCall( "gdi32.dll\DeleteDC", "uint", p_dc ) 
  } 

;#############   remove old rectangle and save screen below new rectangle   ### 
BufferAndRestoreRegion( p_x, p_y, p_w, p_h ) 
  { 
    global   hdc_frame, hdc_buffer 
    static   buffer_state, old_x, old_y, old_w, old_h 
      
    ;Copies the source rectangle directly to the destination rectangle. 
    SRCCOPY   = 0x00CC0020 
        
    ;remove previously drawn rectangle (restore previoulsy buffered color data) 
    if ( buffer_state = "full") 
       ;perform transfer of color data of rectangle from source DC into destination DC 
       ; from buffer to screen, erasing the previously darwn reactangle 
       DllCall( "gdi32.dll\BitBlt" 
              , "uint", hdc_frame 
              , "int", old_x 
              , "int", old_y 
              , "int", old_w 
              , "int", old_h 
              , "uint", hdc_buffer 
              , "int", 0 
              , "int", 0 
              , "uint", SRCCOPY ) 
    else 
       buffer_state = full 
  
    ;remember new rectangle for next loop (to be removed) 
    old_x := p_x 
    old_y := p_y 
    old_w := p_w 
    old_h := p_h 
  
    ; Store current color data of new ractangle in buffer 
    DllCall( "gdi32.dll\BitBlt" 
           , "uint", hdc_buffer 
           , "int", 0 
           , "int", 0 
           , "int", p_w 
           , "int", p_h 
           , "uint", hdc_frame 
           , "int", p_x 
           , "int", p_y 
           , "uint", SRCCOPY ) 
  } 
  
;#############   draw frame   ################################################# 
DrawFrame( p_x, p_y, p_w, p_h, p_t ) 
  { 
    global   hdc_frame, h_region, h_brush 
      
    ; modify dummy rectangular region to desired reactangle 
    DllCall( "gdi32.dll\SetRectRgn" 
           , "uint", h_region 
           , "int", p_x 
           , "int", p_y 
           , "int", p_x+p_w 
           , "int", p_y+p_h ) 
    
    ; draw region frame with thickness (width and hight are the same) 
    DllCall( "gdi32.dll\FrameRgn" 
           , "uint", hdc_frame 
           , "uint", h_region 
           , "uint", h_brush 
           , "int", p_t 
           , "int", p_t ) 
  } 

;#############   draw cross lines   ########################################### 
DrawCross( p_x, p_y, p_w, p_h ) 
  { 
    global   hdc_frame, h_pen 
          
    ;margin to the inside of the region to start drawing the lines 
    LineMargin = 10 

    ;select the correct pen into DC 
    DllCall( "gdi32.dll\SelectObject" 
           , "uint", hdc_frame 
           , "uint", h_pen ) 
                
    ;update the current position to specified point 
    DllCall( "gdi32.dll\MoveToEx" 
           , "uint", hdc_frame 
           , "int", p_x+LineMargin 
           , "int", p_y+LineMargin 
           , "uint", 0) 
    
    ;draw a line from the current position up to, but not including, the specified point. 
    DllCall( "gdi32.dll\LineTo" 
           , "uint", hdc_frame 
           , "int", p_x+p_w-LineMargin 
           , "int", p_y+p_h-LineMargin) 
    
    DllCall( "gdi32.dll\MoveToEx" 
           , "uint", hdc_frame 
           , "int", p_x+p_w-LineMargin 
           , "int", p_y+LineMargin 
           , "uint", 0) 

    DllCall( "gdi32.dll\LineTo" 
           , "uint", hdc_frame 
           , "int", p_x+LineMargin 
           , "int", p_y+p_h-LineMargin) 
  } 

;#############   draw golden cut lines   ###################################### 
DrawGoldenCut( p_x, p_y, p_w, p_h ) 
  { 
    global   hdc_frame, h_penGC 
          
    ;margin to the inside of the region to start drawing the lines 
    LineMargin = 10 

    ;select the correct pen into DC 
    DllCall( "gdi32.dll\SelectObject" 
           , "uint", hdc_frame 
           , "uint", h_penGC ) 

    ;update the current position to specified point 
    DllCall( "gdi32.dll\MoveToEx" 
           , "uint", hdc_frame 
           , "int", p_x+p_w/3 
           , "int", p_y+LineMargin 
           , "uint", 0) 
    
    ;draw a line from the current position up to, but not including, the specified point. 
    DllCall( "gdi32.dll\LineTo" 
           , "uint", hdc_frame 
           , "int", p_x+p_w/3 
           , "int", p_y+p_h-LineMargin) 
    
    DllCall( "gdi32.dll\MoveToEx" 
           , "uint", hdc_frame 
           , "int", p_x+2*p_w/3 
           , "int", p_y+LineMargin 
           , "uint", 0) 

    DllCall( "gdi32.dll\LineTo" 
           , "uint", hdc_frame 
           , "int", p_x+2*p_w/3 
           , "int", p_y+p_h-LineMargin) 
    
    DllCall( "gdi32.dll\MoveToEx" 
           , "uint", hdc_frame 
           , "int", p_x+LineMargin 
           , "int", p_y+p_h/3 
           , "uint", 0) 

    DllCall( "gdi32.dll\LineTo" 
           , "uint", hdc_frame 
           , "int", p_x+p_w-LineMargin 
           , "int", p_y+p_h/3) 
    
    DllCall( "gdi32.dll\MoveToEx" 
           , "uint", hdc_frame 
           , "int", p_x+LineMargin 
           , "int", p_y+2*p_h/3 
           , "uint", 0) 

    DllCall( "gdi32.dll\LineTo" 
           , "uint", hdc_frame 
           , "int", p_x+p_w-LineMargin 
           , "int", p_y+2*p_h/3) 
  } 

;############################################################################## 
;#############   End of File   ################################################ 
;##############################################################################

Ciao
toralf
 
I use the latest AHK version (1.1.15+)
Please ask questions in forum on ahkscript.org. Why?
For online reference please use these Docs.

aarondellis
  • Members
  • 57 posts
  • Last active: Feb 11 2013 02:18 PM
  • Joined: 15 Aug 2005
Wow! :shock: :D
What can not be done in AHK!

Thanks toralf!

enrica
  • Members
  • 117 posts
  • Last active: Feb 26 2016 11:15 PM
  • Joined: 21 Mar 2005

Loop,

{

send, WoW!!!!!!

}

return


65.6E.72.69.63.61. (My hovercraft is full of eels)

AGU
  • Guests
  • Last active:
  • Joined: --
I get an error message under W2k SP4

Error: Can't load icon. The current thread will exit.

It points to line48:
Menu, Tray, Icon, %IconFile%, %EasyCopyIconID%


172x
  • Guests
  • Last active:
  • Joined: --
Wow, greate code :O

Here is mine
My script just take screenshots by draging a frame to capture rectangular regions (using irfanview also), but it work perfect only on single monitor, the screen was not capture correctly if you draw a rectangle on second monitor (multi-screen). Is it irfanview not support multi-screen?



Alt & Lbutton::
    irfanviewPath=C:\Application\IrfanView\i_view32.exe
    Folder=C:\Application\IrfanView\Captures

    if IsIrfanViewExist(irfanviewPATH, "i_view32.exe (IrfanView)") = 1
    {
        CoordMode, Mouse ,Screen 
        MouseGetPos, MX, MY 
        Gui, 1:Color, EEAA99 
        Gui, 1:+Lastfound 
        WinSet, TransColor, EEAA99 
        Gui, 1:-Caption +Border 
        ;Gui, 1:+Resize 
        Loop 
        { 
            If GetKeyState("LButton", "P") 
            { 
                MouseGetPos, MXend, MYend 
                w := abs(MX - MXend) 
                h := abs(MY - MYend) 
                If ( MX < MXend ) 
                    X := MX 
                Else 
                    X := MXend 
                If ( MY < MYend ) 
                    Y := MY 
                Else 
                    Y := MYend 
                Gui, 1:Show, x%X% y%Y% w%w% h%h% 
            }        
            Else 
                Break
            }
            MouseGetPos, MXend, MYend 
            Gui, 1:Destroy 

            file_name := GetFileName(Folder, "SCR", "JPG")
            TakeScreenShot(irfanviewPath, file_name, MX, MY, MXend, MYend, 0)
    }
Return 

TakeScreenShot(ProgramPath, TargetPath, sXpos, sYpos, eXpos, eYpos, vType)
{
    if vType=1				;1 for active Window
        Send,!{PRINTSCREEN} 
    if vType=0				;0 for fullscreen
        Send,{PRINTSCREEN}

    RunWait, `"%ProgramPath%`" /clippaste /crop=(%sXpos%`,%sYpos%`,%eXpos%`,%eYpos%) /convert=`"%TargetPath%`", , hide 
}

IsIrfanViewExist(FilePath, FileName)
{
    IfNotExist, %FilePath% 
    {
        Msgbox File: %FileName% does not exist !
        return 0
    }
    else
        return 1
}

GetFileName(FilePath, FilePrefix, FileExt)
{
    FileNoCount=1
    Loop,
    {
        IfExist, %FilePath%\%FilePrefix%%FileNoCount%.%FileExt%
        {
            FileNoCount++
            continue
        }
        else
            Break 
    }
    f_name = %FilePath%\%FilePrefix%%FileNoCount%.%FileExt%
    return f_name
}

#x:: ExitApp


toralf
  • Moderators
  • 4035 posts
  • Last active: Aug 20 2014 04:23 PM
  • Joined: 31 Jan 2005

I get an error message under W2k SP4

Error: Can't load icon. The current thread will exit.

It points to line48:

Menu, Tray, Icon, %IconFile%, %EasyCopyIconID%


I assume the error is in these lines
;location of icon file 
If ( A_OSType = "WIN32_WINDOWS" )  ; Windows 9x 
    IconFile = %A_WinDir%\system\shell32.dll 
else 
    IconFile = %A_WinDir%\system32\shell32.dll
Could you find out, where your shell32.dll is located? Then set this path hard coded.

I wonder if that happens on all W2k systems?
Ciao
toralf
 
I use the latest AHK version (1.1.15+)
Please ask questions in forum on ahkscript.org. Why?
For online reference please use these Docs.

toralf
  • Moderators
  • 4035 posts
  • Last active: Aug 20 2014 04:23 PM
  • Joined: 31 Jan 2005

Here is mine
My script just take screenshots by draging a frame to capture rectangular regions (using irfanview also), but it work perfect only on single monitor, the screen was not capture correctly if you draw a rectangle on second monitor (multi-screen). Is it irfanview not support multi-screen?

TakeScreenShot(irfanviewPath, file_name, MX, MY, MXend, MYend, 0)

TakeScreenShot(ProgramPath, TargetPath, sXpos, sYpos, eXpos, eYpos, vType)
{
    Send,{PRINTSCREEN}

    RunWait, `"%ProgramPath%`" /clippaste /crop=(%sXpos%`,%sYpos%`,%eXpos%`,%eYpos%) /convert=`"%TargetPath%`", , hide 
}


Hi 172x,
Thank you for your version. I had a look at it. I do have to remarks:

1) You use MY, MY, MXend and MYend to crop the picture. That is dangerous, since if the user has draged the frame from bottom right to upper left, the values will overlap. Since you have calculate X,Y,w,h already, you can use them and they are the correct values.

2) I didn't use the {PRINTSCREEN} /clippaste way, since it will interfere with the clipboard. Since irfanview supports directly screenshot capabilities, you can use it without this interference.

Just my 2 cents

I have taken from your script the idea to put the screenshot filename and path into "". Thanks. I have edited my post and code
Ciao
toralf
 
I use the latest AHK version (1.1.15+)
Please ask questions in forum on ahkscript.org. Why?
For online reference please use these Docs.

AGU
  • Guests
  • Last active:
  • Joined: --

Could you find out, where your shell32.dll is located?

It is located under c:\WINNT\system32\SHELL32.DLL

So it's just like your script says. The strange thing is that SHELL32.DLL is written in capital letters on my system whereas all other dll files are written with small letters. I think this is new and happend after updating the RollUp1 Pack from Microsoft.

Do you think this is the reason why it isn't working?
I'll test that.

AGU
  • Guests
  • Last active:
  • Joined: --
I made a quick and dirty test ;) and I think I found the reason.

The problem is not the finding of system32.dll but the assigned icon id:
EasyCopyIconID      = 175
My system32.dll just contains 108 icons. So it can't find an icon with number 175. Therefore I assume that every W2k User will get this error message.

Chris
  • Administrators
  • 10727 posts
  • Last active:
  • Joined: 02 Mar 2004
You were probably planning this already, but "Menu, Tray, UseErrorLevel" can turn off error reporting for all menu commands. The script could then check the value of ErrorLevel and switch to a different icon number in such cases.

toralf
  • Moderators
  • 4035 posts
  • Last active: Aug 20 2014 04:23 PM
  • Joined: 31 Jan 2005
Thanks Chris, good idea, I didn't knew that

AGU, what icon (ID) would you like to have as a backup?
Ciao
toralf
 
I use the latest AHK version (1.1.15+)
Please ask questions in forum on ahkscript.org. Why?
For online reference please use these Docs.

toralf
  • Moderators
  • 4035 posts
  • Last active: Aug 20 2014 04:23 PM
  • Joined: 31 Jan 2005
I have updated the code to AHK 1.0.38.02 and added a icon ID 14 if the icon 175 couldn't be found in the shell32.dll.
Ciao
toralf
 
I use the latest AHK version (1.1.15+)
Please ask questions in forum on ahkscript.org. Why?
For online reference please use these Docs.

AGU
  • Guests
  • Last active:
  • Joined: --
Now it's working. Icon14 is OK with me. It looks like a globe. (did you know that?)
Maybe Icon 28 or Icon 95 might be a better choice?

For any future purpose I added a picture with all 108 icons contained in my shell32.dll. I made it with your IconViewerLight Script :D in combination with my picture editing software. I don't know if the content of my shell32.dll is representative for all W2K Users, but I expect it.

Here is the file:
https://ahknet.autoh...nUser/Icons.jpg

AGU
  • Guests
  • Last active:
  • Joined: --
Oops forgot to mention, that I'm missing some good installation instruction in the first posting.

How do I have to adjust the path to this exe file?
What about this plugin folder? Does it have to be in ScriptDir?

webber
  • Members
  • 129 posts
  • Last active: Aug 13 2011 06:45 PM
  • Joined: 25 Aug 2005
I get this error message from easy copy

error on line 423 - call to non existent function

"if islabel(redobuffer)"
________
S3X/T2X