Текущий вариант, добавлен Help и сохранение скриншота по двойному щелчку в области окна.
#NoEnv
#UseHook
OnExit, Exit
SetWinDelay, 0
SetBatchLines, -1
CoordMode, Mouse
Menu, Tray, Icon, Shell32.dll, 95
Ini_ReadSect("Color", "Red", Red_, "FF", "Green", Green_, "C7", "Blue", Blue_, "00")
Ini_ReadSect("Transparent", "Trans", Trans, 130)
Ini_ReadSect("Extension", "ext", ext, "bmp")
Ini_ReadSect("Out Directory", "OutDirectory", OutDirectory, A_ScriptDir)
Ini_ReadSect("Write Method", "WriteMethod", WriteMethod, "WinApi")
Ini_ReadSect("Resize Pointers", "ResizePointers", ResizePointers, "Cursors")
Ini_ReadSect("Quality JPEG", "Quality", Quality, 100)
Menu, Tray, NoStandard
Menu, Tray, Add, Hide Pause, Pause
Menu, Tray, Add
Menu, Tray, Add, Help F1, Help
Menu, Tray, Add
Menu, Tray, Add, Exit Esc, Exit
Menu, ResizePointers, Add, Cursors, ResizePointers
Menu, ResizePointers, Add, Markers, ResizePointers
Menu, ResizePointers, Check, %ResizePointers%
Menu, WriteMethod, Add, Via WinApi, WriteMethod
Menu, WriteMethod, Add, Via Paint, WriteMethod
Menu, WriteMethod, Check, Via %WriteMethod%
Menu, OutDirectory, Add, % OutDirectory, OutDirectory
Menu, Quality, Add, Quality = %Quality%`%, QualityOK
Menu, Quality, Add, Change Quality, SetQuality
Menu, Extensions, Add, JPG, :Quality
Menu, Extensions, Add, BMP, Extensions
Menu, Extensions, Add, TIF, Extensions
Menu, Extensions, Add, GIF, Extensions
Menu, Extensions, Add, PNG, Extensions
Menu, Extensions, Check, %ext%
Menu, MainMenu, Add, % "Color – Transparent ", Settings
Menu, MainMenu, Add
Menu, MainMenu, Add, Resize Pointers, :ResizePointers
Menu, MainMenu, Add, Write Method, :WriteMethod
Menu, MainMenu, Add, Out Directory, :OutDirectory
Menu, MainMenu, Add, Extension, :Extensions
Menu, MainMenu, Add
Menu, MainMenu, Add, Save PrintScreen, PrintScreen
Menu, MainMenu, Add, Hide Pause, Pause
Menu, MainMenu, Add
Menu, MainMenu, Add, Help F1, Help
Menu, MainMenu, Add
Menu, MainMenu, Add, Exit Esc, GuiClose
Gui, +LastFound -Caption +AlwaysOnTop +Owner
WinGet, ID
WinSet, Transparent, 0
Gui, Color, % Red_ Green_ Blue_
Locations = x190 y190|x0 y190|x0 y0|x190 y0|x190 y95|x95 y190|x0 y95|x95 y0
StringSplit, Location, Locations,|
Loop 8
Gui, Add, Text, % "w10 h10 Hidden hwndText" a_index "ID " Location%a_index%
Gosub, MarkerColor
Control_Colors(ID, "RCB", 0, 0)
Loop 7
SetCursor("IDC_HAND", "Static" a_index)
Gui, Show, h200 w200, ScreenСatcher
OnMessage(0x201, "WM_LBUTTONDOWN")
OnMessage(0x203, "WM_LBUTTONDBLCLK")
OnMessage(0x204, "WM_RBUTTONDOWN")
Hotkey, LButton, WinResize, Off
Melt(ID, Trans, 1), GuiVisible := 1
SetTimer, %ResizePointers%, 50
Return
Cursors:
S = 10
MouseGetPos, X_M, Y_M, ID_Win
if (ID_Win = ID3) || (ID_Win = ID4)
{
RestoreCursors()
Hotkey, LButton, Off
Return
}
WinGetPos, X, Y, W, H, ahk_id %ID%
XW := X + W, YH := Y + H
if ((X_M <= XW) && (X_M > XW - 2*S) && (Y_M <= YH) && (Y_M > YH - S))
|| ((X_M <= XW) && (X_M > XW - S) && (Y_M <= YH) && (Y_M > YH - 2*S))
Var = 1
else if ((X_M < X + 2*S) && (X_M >= X) && (Y_M <= YH) && (Y_M > YH - S))
|| ((X_M < X + S) && (X_M >= X) && (Y_M <= YH) && (Y_M > YH - 2*S))
Var = 2
else if ((X_M < X + 2*S) && (X_M >= X) && (Y_M < Y + S) && (Y_M >= Y))
|| ((X_M < X + S) && (X_M >= X) && (Y_M < Y + 2*S) && (Y_M >= Y))
Var = 3
else if ((X_M <= XW ) && (X_M > XW - 2*S) && (Y_M < Y + S) && (Y_M >= Y))
|| ((X_M <= XW ) && (X_M > XW - S) && (Y_M < Y + 2*S) && (Y_M >= Y))
Var = 4
else if (X_M <= XW) && (X_M > XW - S) && (Y_M <= YH - S) && (Y_M >= Y + S)
Var = 5
else if (X_M <= XW - S) && (X_M >= X + S) && (Y_M <= YH) && (Y_M > YH - S)
Var = 6
else if (X_M < X + S) && (X_M >= X) && (Y_M <= YH - S) && (Y_M >= Y + S)
Var = 7
else if (X_M <= XW - S) && (X_M >= X + S) && (Y_M < Y + S) && (Y_M >= Y)
Var = 8
else
Var =
if Var
{
Hotkey, LButton, On
if ((Var = 1) || (Var = 3)) && (Cursor != "IDC_SIZENWSE")
RestoreCursors(), SetSystemCursor("IDC_SIZENWSE"), Cursor := "IDC_SIZENWSE"
if ((Var = 2) || (Var = 4)) && (Cursor != "IDC_SIZENESW")
RestoreCursors(), SetSystemCursor("IDC_SIZENESW"), Cursor := "IDC_SIZENESW"
if ((Var = 5) || (Var = 7)) && (Cursor != "IDC_SIZEWE")
RestoreCursors(), SetSystemCursor("IDC_SIZEWE"), Cursor := "IDC_SIZEWE"
if ((Var = 6) || (Var = 8)) && (Cursor != "IDC_SIZENS")
RestoreCursors(), SetSystemCursor("IDC_SIZENS"), Cursor := "IDC_SIZENS"
}
else
{
Hotkey, LButton, Off
RestoreCursors(), Cursor := ""
}
Return
Markers:
MouseGetPos, X_M, Y_M, ID_Win
if (ID_Win = ID3) || (ID_Win = ID4)
{
Hotkey, LButton, Off
Loop 8
GuiControl, Hide, Static%a_index%
Return
}
WinGetPos, X, Y, W, H, ahk_id %ID%
XW := X + W, YH := Y + H
if (X_M <= XW+ 20) && (X_M >= XW - 10) && (Y_M <= YH + 20) && (Y_M >= YH - 10)
Var = 1
else if (X_M <= X + 10) && (X_M >= X - 20) && (Y_M <= YH + 20) && (Y_M >= YH - 10)
Var = 2
else if (X_M <= X + 10) && (X_M >= X - 20) && (Y_M <= Y + 10) && (Y_M >= Y - 20)
Var = 3
else if (X_M <= XW + 20) && (X_M >= XW - 10) && (Y_M <= Y + 10) && (Y_M >= Y - 20)
Var = 4
else if (X_M <= XW + 20) && (X_M >= XW - 10) && (Y_M < YH - 10) && (Y_M > Y + 10)
Var = 5
else if (X_M < XW - 10) && (X_M > X + 10) && (Y_M <= YH + 20) && (Y_M >= YH - 10)
Var = 6
else if (X_M <= X + 10) && (X_M >= X - 20) && (Y_M < YH - 10) && (Y_M > Y + 10)
Var = 7
else if (X_M < XW - 10) && (X_M > X + 10) && (Y_M <= Y + 10) && (Y_M >= Y - 20)
Var = 8
else Var =
if Var
{
Hotkey, LButton, On
GuiControl, Show, Static%Var%
Loop 8
if (a_index != Var)
GuiControl, Hide, Static%a_index%
}
else
{
Hotkey, LButton, Off
Loop 8
GuiControl, Hide, Static%a_index%
}
Return
WinResize:
SetTimer, %ResizePointers%, Off
X_M_Old := X_M, Y_M_Old := Y_M
While GetKeyState("LButton", "P")
{
MouseGetPos, X_M, Y_M
dX := X_M - X_M_Old, dY := Y_M - Y_M_Old
IfEqual, Var, 1, WinMove, ahk_id %ID%,,,, W + dX, H + dY
IfEqual, Var, 2, WinMove, ahk_id %ID%,, X + dX,, W - dX, H + dY
IfEqual, Var, 3, WinMove, ahk_id %ID%,, X + dX, Y + dY, W - dX, H - dY
IfEqual, Var, 4, WinMove, ahk_id %ID%,,, Y + dY, W + dX, H - dY
IfEqual, Var, 5, WinMove, ahk_id %ID%,,,, W + dX
IfEqual, Var, 6, WinMove, ahk_id %ID%,,,,, H + dY
IfEqual, Var, 7, WinMove, ahk_id %ID%,, X + dX,, W - dX
IfEqual, Var, 8, WinMove, ahk_id %ID%,,, Y + dY,, H - dY
Sleep, 10
}
SetTimer, %ResizePointers%, On
Return
GuiSize:
GuiControl, Move, Static1, % "x" A_GuiWidth - 10 "y" A_GuiHeight - 10
GuiControl, Move, Static2, % "x0 y" A_GuiHeight - 10
GuiControl, Move, Static3, % "x0 y0"
GuiControl, Move, Static4, % "x" A_GuiWidth - 10 "y0"
GuiControl, Move, Static5, % "x" A_GuiWidth - 10 "y" (A_GuiHeight - 10)/2
GuiControl, Move, Static6, % "x" (A_GuiWidth - 10)/2 "y" A_GuiHeight - 10
GuiControl, Move, Static7, % "x0 y" (A_GuiHeight - 10)/2
GuiControl, Move, Static8, % "x" (A_GuiWidth - 10)/2 "y0"
Return
GuiContextMenu:
RestoreCursors()
Menu, MainMenu, Show
Return
QualityOK:
Menu, Extensions, UnCheck, %ext%
Menu, Extensions, Check, % (ext := "jpg")
Return
SetQuality:
Old_Quality := Quality
Menu, Extensions, UnCheck, %ext%
Menu, Extensions, Check, % (ext := "jpg")
IfWinExist, ahk_id %ID4%
Goto, 4GuiClose
Gui, 4:+owner1 +LastFound
WinGet, ID4
WinSet, Transparent, 0
Gui, 4:Color, CCC8C0
Gui, 4:Font, s9, Arial
Gui, 4:Add, Text, x11 y17 w29 cBlue, Quality:
Gui, 4:Add, Slider, vQSlider gQualitySet x58 y15 w182 h25 ToolTip AltSubmit, % Quality
Gui, 4:Add, Button, gQOk x80 y50 w90 h23, OK
XQ := X_M - 260 < 0 ? 0 : X_M - 260, YQ := Y_M - 105 < 0 ? 0 : Y_M - 105
Gui, 4:Show, x%XQ% y%YQ% w250 h85, Quality of JPEG
Melt(ID4, 255, 1)
Return
QualitySet:
Quality := QSlider
Return
QOk:
WinClose, ahk_id %ID4%
Return
4GuiClose:
if (Quality != Old_Quality)
Menu, Quality, Rename, Quality = %Old_Quality%`%, Quality = %Quality%`%
Melt(ID4, 255, 0)
Gui, 4:Destroy
Return
Extensions:
Menu, Extensions, UnCheck, %ext%
StringLower, ext, A_ThisMenuItem
Menu, Extensions, Check, %ext%
Return
OutDirectory:
Old_OutDirectory := OutDirectory
Gosub, Pause
FileSelectFolder, OutDir, *%OutDirectory%, 3, Select Out Directory:
OutDirectory := OutDir ? OutDir : OutDirectory
if (OutDirectory != Old_OutDirectory)
Menu, OutDirectory, Rename, %Old_OutDirectory%, %OutDirectory%
if !GuiVisible
Gosub, Pause
Return
ResizePointers:
Menu, ResizePointers, UnCheck, %ResizePointers%
SetTimer, %ResizePointers%, Off
ResizePointers := A_ThisMenuItem
Menu, ResizePointers, Check, %ResizePointers%
Loop 8
GuiControl, Hide, Static%a_index%
SetTimer, %ResizePointers%, 50
RestoreCursors()
Return
WriteMethod:
Menu, WriteMethod, UnCheck, Via %WriteMethod%
WriteMethod := SubStr(A_ThisMenuItem, 5)
Menu, WriteMethod, Check, Via %WriteMethod%
Return
Settings:
IfWinExist, ahk_id %ID3%
Goto, 3GuiClose
Gui, 3:+owner1 +LastFound
WinGet, ID3
WinSet, Transparent, 0
Gui, 3:Color, CCC8C0
Gui, 3:Font, s9, Arial
Gui, 3:Add, Text, x11 y17 w29 cRed, Red
Gui, 3:Add, Text, x10 y47 w30 cGreen, Green
Gui, 3:Add, Text, x11 y77 w29 cBlue, Blue
Gui, 3:Add, Text, x10 y107 w30 cWhite, Trans
Options = x43 w197 h20 Range0-255 ToolTip AltSubmit
Gui, 3:Add, Slider, vRed gColorSet %Options% y15, 0x%Red_%
Gui, 3:Add, Slider, vGreen gColorSet %Options% y45, 0x%Green_%
Gui, 3:Add, Slider, vBlue gColorSet %Options% y75, 0x%Blue_%
Gui, 3:Add, Slider, vTrans gTransSet %Options% y105, % Trans
Gui, 3:Add, Button, g3GuiClose x80 y140 w90 h23, OK
WinGetPos, X, Y, W, H, ahk_id %ID%
3Gui_Y := (Y + H + 15 + 180 <= A_ScreenHeight) ? Y + H + 15 : Y - 180 - 35
3Gui_Y := (3Gui_Y < 0) ? 0 : 3Gui_Y
3Gui_X := (X+(W-250)/2+250 > A_ScreenWidth) ? A_ScreenWidth - 250 : X + (W-256)/2
3Gui_X := (3Gui_X < 0) ? 0 : 3Gui_X
GuiControl, 3:Focus, Static1
Gui, 3:Show, x%3Gui_X% y%3Gui_Y% w250 h180, Color – Transparent
Melt(ID3, 255, 1)
Return
ColorSet:
%A_GuiControl%_ := SubStr("00" . Trans(%A_GuiControl%, 10, 16), -1)
Gui, 1:Color, % Red_ Green_ Blue_
MarkerColor:
MarkerColor := InvertColor(Red_, Green_, Blue_)
Loop 8
Control_Colors(Text%a_index%ID, "Set", MarkerColor)
Return
TransSet:
WinSet, Transparent, % Trans, ahk_id %ID%
Return
3GuiClose:
Melt(ID3, 255, 0)
Gui, 3:Destroy
Return
Help:
IfWinExist, ahk_id %ID5%
Goto, 5GuiClose
if ((X < 540) && (Y < 590)) && GuiVisible
{
DetectHiddenWindows On
Melt(ID, Trans, 0)
WinMove, ahk_id %ID%,, 540
Melt(ID, Trans, 1)
}
Gui, 5:Default
Gui, +LastFound +Resize
WinGet, ID5
WinSet, Transparent, 0
Gui, Color, White
Gui, Add, Text, x0 y0 w515 h550 -Background
Gui, Add, Text, x4 y4 w507 h73 +0x6
Gui, Font, s10 bold, Arial
Gui, Add, Text, x9 y11 BackgroundTrans, Содержание:
Gui, Font, s9 norm underline
Gui, Add, Text, gPass x30 y32 cBlue BackgroundTrans, Работа с программой
Gui, Add, Text, gPass xp yp+16 cBlue BackgroundTrans, Контекстное меню
Gui, Add, Text, gPass x200 y32 cBlue BackgroundTrans, Меню иконки в трее
Gui, Add, Text, gPass xp yp+16 cBlue BackgroundTrans, Горячие клавиши
Gui, Font, s10 norm
HelpText =
(Join
Программа «ScreenСatcher» создана для получения скриншотов экрана или его областе
й и сохранения их в файлы с расширениями jpg, bmp, tif, gif, png.`n
`n Работа с программой.`n`n После запуска ф
айла на экране появляется полупрозрачное окно, которое можно перемещать левой кнопкой м
ыши и менять его размеры.`n`n Чтобы получить скриншот области экрана, разместите ок
но точно над ней и кликните дважды в пределах окна. Изображение будет записано в файл
, который появится в выбранной папке (по умолчанию – в папке скрипта).`n Чтобы полу
чить скриншот всего экрана, скройте (при необходимости) окно программы нажатием средне
й кнопки мыши и нажмите клавишу PrintScreen.`n Для получения скриншота активного ок
на нажмите Alt + PrintScreen.`n`n Управление программой осуществляется через контек
стное меню главного окна (клик правой кнопкой мыши в пределах окна) и меню иконки програ
ммы в трее (клик правой кнопкой мыши на иконке программы в трее).`n
`n Контекстное меню.`n`nColor – Transparent.`nУ
становки цвета и прозрачности окна.`n`nResize Pointers.`nВыбор индикатора, отображаемог
о при изменении размеров окна: модифицированный курсор мыши, либо цветные маркеры.`n`nW
rite Method.`nСпособ сохранения изображения в файл. Выбираете тот, который будет работат
ь у Вас корректнее (не сработал первый – попробуйте второй).`n`nOut Directory.`nПри выбо
ре этого пункта появляется подменю с названием текущей папки, в которую будут помещатьс
я файлы скриншотов. Для смены папки кликните это подменю.`n`nExtension.`nВыбор расширени
я файлов, в которые будут записываться скриншоты. При выборе JPG открывается подменю с д
вумя пунктами. 1-ый – текущее значение качества (степени сжатия) JPEG, кликните его, есл
и оно Вас устраивает. 2-ой – Change Quality – смена качества JPEG.`n`nSave.`nСохранит
ь в файл скриншот области экрана под окном программы.`n`nHide.`nСпрятать окно программы
.`n`n Меню иконки в трее.`n`nHide.`nСпрятать ок
но программы.`n`nShow.`nПоказать окно программы.`n
`n Горячие клавиши.`n`nP
ause, а также щелчок средней кнопкой мыши – скрыть/показать окно.`nScrollLock – вернут
ь окно в центр экрана.`nPrintScreen – если окно скрипта скрыто, скриншот всего экрана, е
сли видимо – скриншот области экрана, лежащей непосредственно под окном.`nAlt + PrintScr
een – скриншот активного окна.`nEsc – закрытие окон установок и справки, если открыты, и
ли выход из программы.`nЕсли открыто окно установок, щелчок ЛКМ по названию слайдера – у
становка в левую крайнюю позицию, ПКМ – в правую крайнюю.`nF1 – вызов справки.
)
Gui, Add, Edit, x3 y81 w509 h466 ReadOnly hwndEditID, % HelpText
GuiControl, Focus, Static1
Gui, Show, x0 y0 w515 h550, ScreenСatcher Help
Melt(ID5, 255, 1, 40)
Return
Pass:
SendMessage, EM_LINEFROMCHAR := 201, InStr(HelpText, A_GuiControl) - 1,,, ahk_id %EditID%
GotoLineUp(ErrorLevel + 1, EditID)
SendInput, {Home}+{Right 3}
Return
5GuiSize:
GuiControl, Move, Static1, w%A_GuiWidth% h%A_GuiHeight%
GuiControl, Move, Static2, % "w" A_GuiWidth - 8
GuiControl, Move, Edit1, % "w" A_GuiWidth - 6 "h" A_GuiHeight - 84
Return
5GuiClose:
Melt(ID5, 255, 0, 40)
Gui, 5:Destroy
Return
Exit:
While (idx := a_index + 2) < 6
IfWinExist, % "ahk_id" ID%idx%
Gosub, %idx%GuiClose
if GuiVisible
{
Melt(ID, Trans, 0)
Gui, Destroy
}
Ini_WriteSect("Color", "Red", Red_, "Green", Green_, "Blue", Blue_)
Ini_WriteSect("Transparent", "Trans", Trans)
Ini_WriteSect("Extension", "ext", ext)
Ini_WriteSect("Out Directory", "OutDirectory", OutDirectory)
Ini_WriteSect("Write Method", "WriteMethod", WriteMethod)
Ini_WriteSect("Resize Pointers", "ResizePointers", ResizePointers)
Ini_WriteSect("Quality JPEG", "Quality", Quality)
RestoreCursors()
ExitApp
#IfWinActive ScreenСatcher ahk_class AutoHotkeyGUI
F1:: Goto, Help
#IfWinActive ScreenСatcher Help ahk_class AutoHotkeyGUI
F1:: Goto, Help
~WheelUp::
~WheelDown::
GuiControl, 5:Focus, Edit1
Return
#IfWinExist Color – Transparent ahk_class AutoHotkeyGUI
Esc:: Goto, 3GuiClose
#IfWinExist Quality of JPEG ahk_class AutoHotkeyGUI
Esc:: Goto, 4GuiClose
#IfWinExist ScreenСatcher Help ahk_class AutoHotkeyGUI
Esc:: Goto, 5GuiClose
#IfWinExist
PrintScreen::
IfWinExist, ahk_id %ID%
{
WinGetPos, X, Y, W, H, ahk_id %ID%
Melt(ID, Trans, 0, 50)
Gui, 2:-Caption +LastFound
Gui, 2:Show, x%X% y%Y% w%W% h%H% hide
WinActivate
Send, !{PrintScreen}
Gui, 2:Destroy
Melt(ID, Trans, 1, 50)
}
Else
Send, {PrintScreen}
WriteFile:
IfNotExist, % OutDirectory
OutDirectory := A_ScriptDir
if WriteMethod = Paint
SaveBufferToFileViaPaint(OutDirectory "\" A_Year A_MM A_DD "-" A_Hour A_Min A_Sec "." ext)
else
Convert("", OutDirectory "\" A_Year A_MM A_DD "-" A_Hour A_Min A_Sec "." ext, Quality)
Return
~!PrintScreen:: Goto, WriteFile
MButton::
Pause::
Melt(ID, Trans, GuiVisible := !GuiVisible)
if GuiVisible
Menu, Tray, Rename, Show Pause, Hide Pause
Else
Menu, Tray, Rename, Hide Pause, Show Pause
Return
ScrollLock::
if GuiVisible
Melt(ID, Trans, 0)
Else
Menu, Tray, Rename, Show Pause, Hide Pause
Gui, Show, % "x" A_ScreenWidth/2 - 100 "y" A_ScreenHeight/2 - 118 "w200 h200"
Melt(ID, 130, 1), Trans := 130, GuiVisible := 1
GuiControl, 3:, Trans, 130
Return
Esc::
GuiClose:
ExitApp
Melt(hWnd, Trans, Appear, N = 20)
{
WinShow, ahk_id %hWnd%
While A_Index * N < Trans
{
WinSet, Transparent, % Appear ? A_Index * N : Trans - A_Index * N, ahk_id %hWnd%
Sleep, 10
}
if Appear
WinSet, Transparent, % Trans, ahk_id %hWnd%
Else
WinHide, ahk_id %hWnd%
}
WM_LBUTTONDBLCLK(wp, lp, msg, hwnd)
{
global ID
if (hwnd = ID)
Gosub, PrintScreen
}
WM_LBUTTONDOWN(wp, lp, msg, hwnd)
{
global ID, ID3, ID4, Var
if (hwnd = ID) && (!Var || GetKeyState("Alt"))
PostMessage, WM_NCLBUTTONDOWN := 0xA1, 2,,, ahk_id %ID%
if (hwnd = ID3)
SetValue1(0)
if (hwnd = ID4)
SetValue2(0)
}
WM_RBUTTONDOWN(wp, lp, msg, hwnd)
{
global ID3, ID4
if (hwnd = ID3)
SetValue1(255)
if (hwnd = ID4)
SetValue2(255)
}
SetValue1(Pos)
{
local Control, Text
MouseGetPos,,,, Control
if !InStr(Control, "Static")
Return
GuiControl, 3:, % "msctls_trackbar32" SubStr(Control, 7), % Pos
Gui, 3:Submit, NoHide
GuiControlGet, Text, 3:, % Control
%Text%_ := SubStr("00" . Trans(%Text%, 10, 16), -1)
Gui, 1:Color, % Red_ Green_ Blue_
Gosub, MarkerColor
Gosub, TransSet
}
SetValue2(Pos)
{
local Control
MouseGetPos,,,, Control
if !InStr(Control, "Static")
Return
GuiControl, 4:, msctls_trackbar321, % Pos
Gui, 4:Submit, NoHide
Quality := QSlider
}
InvertColor(Red, Green, Blue)
{
_Red := SubStr("00" . Trans(Trans(Red, 16, 10) ^ 255, 10, 16), -1)
_Green := SubStr("00" . Trans(Trans(Green, 16, 10) ^ 255, 10, 16), -1)
_Blue := SubStr("00" . Trans(Trans(Blue, 16, 10) ^ 255, 10, 16), -1)
Return "0x" _Blue _Green _Red
}
Ini_WriteSect(Section, Key1, Value1, Key2 = "", Value2 = ""
, Key3 = "", Value3 = "", Key4 = "", Value4 = "", Key5 = "", Value5 = ""
, Key6 = "", Value6 = "", Key7 = "", Value7 = "", Key8 = "", Value8 = ""
, Key9 = "", Value9 = "", Key10 = "", Value10 = "")
{
; Пишет секцию ini-файла в директории скрипта, за раз не более 10-ти ключей
FileName := A_ScriptDir "\" SubStr(A_ScriptName, 1, -3) "ini"
While Key%a_index%
IniWrite, % Value%a_index%, % FileName, % Section, % Key%a_index%
}
Ini_ReadSect(Section, Key1, ByRef var1, Default1 = "", Key2 = "", ByRef var2 = "", Default2 = ""
, Key3 = "", ByRef var3 = "", Default3 = "", Key4 = "", ByRef var4 = "", Default4 = ""
, Key5 = "", ByRef var5 = "", Default5 = "", Key6 = "", ByRef var6 = "", Default6 = ""
, Key7 = "", ByRef var7 = "", Default7 = "", Key8 = "", ByRef var8 = "", Default8 = ""
, Key9 = "", ByRef var9 = "", Default9 = "", Key10 = "", ByRef var10 = "", Default10 = "")
{
; Читает секцию ini-файла в директории скрипта, за раз не более 10-ти ключей
FileName := A_ScriptDir "\" SubStr(A_ScriptName, 1, -3) "ini"
While Key%a_index%
IniRead, var%a_index%, % FileName, % Section, % Key%a_index%, % Default%a_index%
}
Trans(Number, N, K)
{
; Переводит число Number из системы счисления N в систему счисления K. Number должно
; быть написано без префикса, и, если содержит буквенные символы, в кавычках.
; Возвращает значение без префикса.
if N = 10
Return Trans_Dec(Number, K)
if K = 10
Return Trans_ToDec(Number, N)
Else
Return Trans_Dec(Trans_ToDec(Number, N), K)
}
Trans_Dec(Number, K)
{
if K = 16
{
SetFormat, integer, hex
TransNumber := SubStr(Number + 0, 3)
SetFormat, integer, dec
Return TransNumber
}
if (Number < K)
Return Number < 10 ? Number : Chr(Asc("A") + Number - 10)
Mod := Mod(Number,K) < 10 ? Mod(Number,K) : Chr(Asc("A") + Mod(Number,K) - 10)
Return Trans_Dec(Floor(Number/K),K) . Mod
}
Trans_ToDec(Number, N)
{
if N = 16
{
SetFormat, integer, d
Number := "0x" . Number
Return Number + 0
}
StringCaseSense on
if StrLen(Number) = 1
{
if Number between a and z
Number := Asc(Number) - Asc("a") + 10
if Number between A and Z
Number := Asc(Number) - Asc("A") + 10
Return Number
}
SubString := SubStr(Number,1,1)
if SubString between a and z
SubString := Asc(SubString) - Asc("a") + 10
if SubString between A and Z
SubString := Asc(SubString) - Asc("A") + 10
Return SubString*N**(StrLen(Number)-1) + Trans_ToDec(SubStr(Number,2),N)
}
GotoLineUp(N, Hwnd_Edit)
{
; Осуществляет переход к строке с номером N в контроле Edit, строка, если
; возможно, становится первой видимой
EM_LINEINDEX := 0xBB, EM_SETSEL := 0xB1, EM_SCROLLCARET := 0xB7
EM_GETFIRSTVISIBLELINE := 0xCE, EM_LINESCROLL := 0xB6
SendMessage, EM_LINEINDEX, N - 1,,, ahk_id %Hwnd_Edit%
SendMessage, EM_SETSEL, Errorlevel, Errorlevel,, ahk_id %Hwnd_Edit%
SendMessage, EM_SCROLLCARET,,,, ahk_id %Hwnd_Edit%
SendMessage, EM_GETFIRSTVISIBLELINE,,,, ahk_id %Hwnd_Edit%
SendMessage, EM_LINESCROLL,, N - 1 - Errorlevel,, ahk_id %Hwnd_Edit%
ControlFocus,, ahk_id %Hwnd_Edit%
SendInput, {End}
}
Convert(sFileFr = "", sFileTo = "", nQuality = "")
{
If sFileTo =
sFileTo := A_ScriptDir . "\screen.bmp"
SplitPath, sFileTo, , sDirTo, sExtTo, sNameTo
If Not hGdiPlus := DllCall("LoadLibrary", "str", "gdiplus.dll")
Return sFileFr+0 ? SaveHBITMAPToFile(sFileFr, sDirTo . "\" . sNameTo . ".bmp") : ""
VarSetCapacity(si, 16, 0), si := Chr(1)
DllCall("gdiplus\GdiplusStartup", "UintP", pToken, "Uint", &si, "Uint", 0)
If !sFileFr
{
DllCall("OpenClipboard", "Uint", 0)
If DllCall("IsClipboardFormatAvailable", "Uint", 2)
&& (hBM:=DllCall("GetClipboardData", "Uint", 2))
DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", hBM, "Uint", 0, "UintP", pImage)
DllCall("CloseClipboard")
}
Else If sFileFr Is Integer
DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", sFileFr, "Uint", 0, "UintP", pImage)
Else DllCall("gdiplus\GdipLoadImageFromFile"
, "Uint", Unicode4Ansi(wFileFr,sFileFr), "UintP", pImage)
DllCall("gdiplus\GdipGetImageEncodersSize", "UintP", nCount, "UintP", nSize)
VarSetCapacity(ci,nSize,0)
DllCall("gdiplus\GdipGetImageEncoders", "Uint", nCount, "Uint", nSize, "Uint", &ci)
Loop, % nCount
If InStr(Ansi4Unicode(NumGet(ci,76*(A_Index-1)+44)), "." . sExtTo)
{
pCodec := &ci+76*(A_Index-1)
Break
}
If InStr(".JPG.JPEG.JPE.JFIF", "." . sExtTo) && nQuality<>"" && pImage && pCodec
{
DllCall("gdiplus\GdipGetEncoderParameterListSize", "Uint", pImage
, "Uint", pCodec, "UintP", nSize)
VarSetCapacity(pi,nSize,0)
DllCall("gdiplus\GdipGetEncoderParameterList", "Uint", pImage, "Uint", pCodec, "Uint"
, nSize, "Uint", &pi)
Loop, % NumGet(pi)
If NumGet(pi,28*(A_Index-1)+20)=1 && NumGet(pi,28*(A_Index-1)+24)=6
{
pParam := &pi+28*(A_Index-1)
NumPut(nQuality,NumGet(NumPut(4,NumPut(1,pParam+0)+20)))
Break
}
}
If pImage
pCodec ? DllCall("gdiplus\GdipSaveImageToFile", "Uint", pImage
, "Uint", Unicode4Ansi(wFileTo,sFileTo), "Uint", pCodec
, "Uint", pParam) : DllCall("gdiplus\GdipCreateHBITMAPFromBitmap"
, "Uint", pImage, "UintP", hBitmap
, "Uint", 0) . SetClipboardData(hBitmap)
, DllCall("gdiplus\GdipDisposeImage", "Uint", pImage)
DllCall("gdiplus\GdiplusShutdown" , "Uint", pToken)
DllCall("FreeLibrary", "Uint", hGdiPlus)
}
SaveHBITMAPToFile(hBitmap, sFile)
{
DllCall("GetObject", "Uint", hBitmap, "int", VarSetCapacity(oi,84,0), "Uint", &oi)
hFile:= DllCall("CreateFile", "Uint", &sFile, "Uint", 0x40000000, "Uint", 0
, "Uint", 0, "Uint", 2, "Uint", 0, "Uint", 0)
DllCall("WriteFile", "Uint", hFile, "int64P", 0x4D42|14+40+NumGet(oi,44)<<16
, "Uint", 6, "UintP", 0, "Uint", 0)
DllCall("WriteFile", "Uint", hFile, "int64P", 54<<32, "Uint", 8, "UintP", 0, "Uint", 0)
DllCall("WriteFile", "Uint", hFile, "Uint", &oi+24, "Uint", 40, "UintP", 0, "Uint", 0)
DllCall("WriteFile", "Uint", hFile, "Uint", NumGet(oi,20)
, "Uint", NumGet(oi,44), "UintP", 0, "Uint", 0)
DllCall("CloseHandle", "Uint", hFile)
}
SetClipboardData(hBitmap)
{
DllCall("GetObject", "Uint", hBitmap, "int", VarSetCapacity(oi,84,0), "Uint", &oi)
hDIB := DllCall("GlobalAlloc", "Uint", 2, "Uint", 40+NumGet(oi,44))
pDIB := DllCall("GlobalLock", "Uint", hDIB)
DllCall("RtlMoveMemory", "Uint", pDIB, "Uint", &oi+24, "Uint", 40)
DllCall("RtlMoveMemory", "Uint", pDIB+40, "Uint", NumGet(oi,20), "Uint", NumGet(oi,44))
DllCall("GlobalUnlock", "Uint", hDIB)
DllCall("DeleteObject", "Uint", hBitmap)
DllCall("OpenClipboard", "Uint", 0)
DllCall("EmptyClipboard")
DllCall("SetClipboardData", "Uint", 8, "Uint", hDIB)
DllCall("CloseClipboard")
}
Unicode4Ansi(ByRef wString, sString)
{
nSize := DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString
, "int", -1, "Uint", 0, "int", 0)
VarSetCapacity(wString, nSize * 2)
DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1
, "Uint", &wString, "int", nSize)
Return &wString
}
Ansi4Unicode(pString)
{
nSize := DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString
, "int", -1, "Uint", 0, "int", 0, "Uint", 0, "Uint", 0)
VarSetCapacity(sString, nSize)
DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString
, "int", -1, "str", sString, "int", nSize, "Uint", 0, "Uint", 0)
Return sString
}
SaveBufferToFileViaPaint(FilePath)
{
global Quality
Critical
WM_COMMAND = 0x111
RegRead, BMPHeight_Old, HKCU
, Software\Microsoft\Windows\CurrentVersion\Applets\Paint\View, BMPHeight
RegRead, BMPWidth_Old, HKCU
, Software\Microsoft\Windows\CurrentVersion\Applets\Paint\View, BMPWidth
if (BMPHeight_Old = "") || (BMPWidth_Old = "")
{
MsgBox, 16, Error!, Ошибка чтения реестра!, 2
Return
}
RegWrite, REG_DWORD, HKCU
, Software\Microsoft\Windows\CurrentVersion\Applets\Paint\View, BMPHeight, 1
RegWrite, REG_DWORD, HKCU
, Software\Microsoft\Windows\CurrentVersion\Applets\Paint\View, BMPWidth, 1
DetectHiddenWindows, On
SplitPath, FilePath, OutFileName, OutDir, OutExtension, OutNameNoExt
if OutExtension != bmp
Old_FilePath := FilePath, FilePath := A_Temp . "\" . OutNameNoExt . ".bmp"
FileAppend,, %FilePath%
Run, mspaint "%FilePath%",, Hide
WinWait, ahk_class MSPaintApp
;команда меню "Правка" - "Вставить"
PostMessage, WM_COMMAND, 57637
;команда меню "Файл" - "Сохранить"
PostMessage, WM_COMMAND, 57603
WinClose
WinWaitClose,,, 1
if ErrorLevel
{
WinShow
MsgBox, 48, Error!, Ошибка работы с mspaint.exe!, 2
}
RegWrite, REG_DWORD, HKCU
, Software\Microsoft\Windows\CurrentVersion\Applets\Paint\View,BMPHeight,%BMPHeight_Old%
RegWrite, REG_DWORD, HKCU
, Software\Microsoft\Windows\CurrentVersion\Applets\Paint\View, BMPWidth, %BMPWidth_Old%
if OutExtension != bmp
{
Convert(FilePath, Old_FilePath, Quality)
FileDelete, % FilePath
}
}
SetCursor(pShape, pCtrl="")
{
return SetCursor_(pShape, pCtrl, 0)
}
SetCursor_(wparam, lparam, msg)
{
global ID, ID3, ID5
static WM_SETCURSOR = 0x20, WM_MOUSEMOVE = 0x200
static IDC_HAND = 32649, IDC_ARROW = 32512
static hover, cursor, ctrls = "`n", init
if !init
init := 1, OnMessage(WM_SETCURSOR, "SetCursor_"), OnMessage(WM_MOUSEMOVE, "SetCursor_")
if A_Gui =
{
cursor := DllCall("LoadCursor", UInt, 0, Int, %WPARAM%, UInt)
ctrls .= lparam "=" cursor "`n"
}
If (msg = WM_SETCURSOR)
ifEqual, hover, 1, return 1
if (msg = WM_MOUSEMOVE)
{
MouseGetPos,,, ID_Win, Control
if (ID_Win = ID)
Return
If j := InStr(ctrls, "`n" Control "=")
{
if (ID_Win = ID5) && (SubStr(Control, 7) < 4)
{
DllCall("SetCursor", UInt, IDC_ARROW), hover := ""
Return
}
hover := true
j += 2 + StrLen(Control)
j := SubStr(ctrls, j, InStr(ctrls, "`n", 0, j) - j + 1)
DllCall("SetCursor", UInt, j)
}
else DllCall("SetCursor", UInt, IDC_ARROW), hover := ""
}
}
SetSystemCursor(IDC)
{
IDC_SIZENWSE = 32642
IDC_SIZENESW = 32643
IDC_SIZEWE = 32644
IDC_SIZENS = 32645
IDC_ARROW = 32512
CursorHandle := DllCall( "LoadCursor", Uint, 0, Int, %IDC%, Uint)
DllCall( "SetSystemCursor", Uint, CursorHandle, Int, IDC_ARROW)
}
RestoreCursors()
{
SPI_SETCURSORS = 0x57
DllCall( "SystemParametersInfo", UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0 )
}
Control_Colors(Hwnd, Msg, wParam, lParam = 0)
{
Thread, Priority, 2147483647
If !(Hwnd+0) {
GuiControlGet, nHwnd, Hwnd, %Hwnd%
Hwnd := nhwnd
}
Static OldWinProc := "" ; origin Windowprocedure
Static NewWinProc := "" ; new Windowprocedure
Static SetValue := "Set" ; take over Values
Static Register := "RCB" ; RegisterCallBack
Static ValueList := "" ; Values
If (A_EventInfo <> NewWinProc) {
If (Msg = SetValue) {
If (RegExMatch(ValueList, "m)^" . (Hwnd +0) . "\|")) {
ValueList := RegExReplace(ValueList
, "m)^" . (Hwnd + 0) . "\|.*$"
, (Hwnd + 0) . "|"
. (wParam + 0) . "|"
. (lParam + 0))
} Else {
ValueList .= (Hwnd + 0) . "|"
. (wParam + 0) . "|"
. (lParam + 0) . "`r`n"
}
Return
}
If (Msg = Register) {
If (NewWinProc = "") {
NewWinProc := RegisterCallback("Control_Colors","",4)
OldWinProc := DllCall("SetWindowLong"
, UInt, Hwnd
, Int, -4
, Int, NewWinProc
, UInt)
}
Return
}
Return
}
; 0x0133 : WM_CTLCOLOREDIT
; 0x0138 : WM_CTLCOLORSTATIC
If (Msg = 0x0133 Or Msg = 0x0135 Or Msg = 0x0138) {
If (RegExMatch(ValueList, "m)^"
. (lParam + 0) . "\|(?P<BG>\d+)\|(?P<TX>\d+)$"
, C)) {
DllCall("SetTextColor", UInt, wParam, UInt, CTX)
DllCall("SetBkColor", UInt, wParam, UInt, CBG)
Return, DllCall("CreateSolidBrush", UInt, CBG)
}
}
Return DllCall("CallWindowProcA"
, UInt, OldWinProc
, UInt, Hwnd
, UInt, Msg
, UInt, wParam
, UInt, lParam)
}
Единственная проблема — я так и не узнал, работает ли скрипт под Vista. Поэтому, прошу тех, кто пользуется Vista, сделать следующее:
1. Убедиться, что Ваша версия AHK не ниже, чем 1.0.48.
2. Запустить скрипт.
3. Выбрать в контекстном меню окна скрипта Write Method\Via Paint и попробовать сохранить скриншот.
4. В случае, если п.3 выполнен успешно, выбрать в контекстном меню Extension\Tif и попробовать сохранить скриншот.
О результатах прошу отписаться здесь.