#NoEnv SendMode Input SetWorkingDir %A_ScriptDir% #SingleInstance, force Menu, Tray, Icon, shell32.dll, 21 CoordMode Mouse CoordMode ToolTip goto Start ; Настройки горячих клавиш программы должны быть: Ctrl+F12 - создание, CTRL+ALT+F12 - показать главное окно. ; В Настройках - Захват текста - После захвата должно стоять "Открыть на редактирование" ; Скрипт связывает клавишу с номером (существующей!) вкладки и набором тэгов. Комбинация RCtrl+RShift+клавиша создает заметку, RCtrl+RAlt+клавиша - открывает соответствующую вкладку и тэг. ; При запуске в каталоге скрипта создается одноименный cfg-файл, задающий эти соответствия. ; Синтаксис строк предельно прост: ; номер секции,тэг или набор тэгов,имя клавиши или ее код (виртуальный или скан),пояснение (необязательно). ; Например: ; 1,,1 - первая секция без тэга по 1 (строки такого вида добавляются автоматически) ; 1,Comp,vk43,c - тэг Comp в первой секции по клавише c ; 1,Soft Comp,vk53,s - два тэга там же по s ; 1,Books/читать,sc30,b - дочерний тэг "читать" в Books по b ; 1,Книги Books/читать,F6 - комбинация двух предыдущих возможностей по F6 (использование "," и ";" как разделителя не допускается - только пробел) ; Для применения изменений следует перезапустить скрипт! ;~ Кроме постоянных значений, для записи в тэг возможно использование следующих переменных: ;~ $time - при создании заметки выводится окно ввода даты и времени с календарем, которые подставляются в тэг (8,Дела/$time,vkC0,~) ;~ $site - подставляет в тэг корневой адрес сайта, открытого в браузере ;~ $cmd - имя файла без расширения, извлеченное из командной строки открытой вместе с файлом программы. ;~ $title - название или имя файла без расширения, взятое из заголовка окна; ищет там и полный путь. ;~ $cmt - переменная, совмещающая возможности двух предыдущих: сначала ищется путь файла в командной строке, а если он отсутствует, используется заголовок окна. ;~ $file - файл под курсором в проводнике или файловом менеджере ;~ $proc - имя процесса активного окна без расширения ;~ $dict - создание алфавитных каталогов. Текст из начала заметки идет в заголовок, переменная заменяется его начальной буквой в верхнем регистре(например, при записи 1,English/%dict,F5, слово godspeed по F5 получит тэг English/G) ;~ $z - наличие в любом месте автоматически сохраняет заметку и закрывает окно с секундной задержкой ; В файле конфигурации допускаются пустые строки, лишние пробелы - только в пояснениях. Временно ненужное можно закоментировать ";". ; --------- Горячие клавиши ---------- ; В открытом окне заметки: ; RCtrl+клавиша - замена секции и тэга данными, связанными с клавишей ; RShift+клавиша - дополнение текущего тэга связанным с клавишей (производится проверка, связан ли он с текущей секцией) ; По L/RCtrl+Space и L/RShift+Space - добавляются настраиваемые тэги, суффиксы или дочерние тэги (см. ниже) ; Чтобы сделать заметку из распознанного текста, зажимаем Shift и щелкаем средней кнопкой мыши. Под курсором появляется прямоугольное полупрозрачное окошко.Перетаскивая его мышью и масштабируя за углы и края, накрываем интересующий участок текста. Щелчок правой кнопкой мыши по окну выделения - подтверждение, Escape или щелчок правой кнопкой вне окна - отмена операции. Далее делается заметка клавишей CintaNotes или скриптовым сочетание клавишю ;~ RShift+F12 - открытие интерфейса программы с текстом, бывшим в момент закрытия. >^>+F12::Run % "Notepad.exe " cfg ; RCtrl+RShift+F12 - окрытие конфигурационного файла >^>+Space::goto Last_add ; RCtrl+RShift+Space - создание заметки в той же секции и с теми же тэгами, что и в последний раз $>^>!Space::goto Last_open ; RCtrl+RAlt+Space - открытие последних созданных заметок ; -------- Мышь (в главном окне программы) -------- #IfWinActive ahk_class CintaNotes.MainFrame MButton::Send {LButton}{F7} ; Cредняя кнопка - открытие ссылки заметки под курсором #IfWinActive Start: ;------------ Настройки скрипта ------------- ctrl_tag:="_ToDo" ; Суффикс, прописывающийся при секундном зажатии правого Ctrl в тэг при создании заметки. Если вписать " ToDo", будет добавляться дополнительный тэг, если "/ToDo" - дочерний lctrl_space:="_rem" ; суффикс, дополнительный или дочерний тэг дописывающийся к текущему тэгу по LCtrl+Space в окне редактирования rctrl_space:="_ToDo" ; то же для RCtrl+Space lshift_space:=" !Смотреть" ; то же для LShift+Space rshift_space:="_Old" ; то же для RShift+Space t_tree:="yyyy_MM/dd_dddd" ; комбинация, подставляющаяся в тэг вместо даты при использовании $time. Определяет вид дерева дат в боковой панели dir_path:=0 ; при использовании $cmd, $title, $cmt и $file создавать ссылку на каталог вместо ссылки на файл max_empty_str:=2 ; максимальное число последовательных пустых строк в скопированном в заметку тексте end_note:="Больше информации на http|Читайте далее: http|Читать далее: http|Подробности: http|Источник: http" ; начала обрезаемых хвостов, добавляемых при копировании текста скриптами на веб-страницах, разделенные "|" clip:=2 ; сохранять в буфере обмена после создания заметки: 1 - текст заметки, 2 - первую непустую строку в виде, пригодном для переименования файлов (заметки о файлах, ставящихся на закачку); 0 - прежнее содержимое link2rem:=1 ; копировать адреса и пути из раздела ссылки в примечания ;------------ Настройки OCR ------------- ; Наборам языков сопоставляются переменные lng_%n%, отображаемые в выпадающем меню. Коды языков соответствуют именам файлов языковых пакетов в папке tessdata. Не более 2-х языков одновременно через "+". lng_1:="rus+eng" ; дефолтный язык распознавания lng_2:="rus" lng_3:="eng" lng_4:="deu" lng_5:="fra" lng_6:="spa" opaque:=130 ; непрозрачность окна выделения текста (1-255) color:="FFDC00" ; его цвет ft:=16 ; размер шрифта окна распознанного текста sep:=0 ; сохранение разделителей фрагментов по умолчанию search:="https://www.google.ru/search?client=opera&q=%s&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest&gws_rd=ssl" ; строка поиска текста translate:="www.translate.google.com/#auto|ru|%s" ; строка перевода текста ;----------------------------------------------- SysGet, M, MonitorWorkArea text:="", lng:=lng_1 history:="OCR history" A_Tab . A_Tab SplitPath A_ScriptName, , , , cfg cfg:=cfg ".cfg" IfNotExist % cfg FileAppend , % "1,,1`r`n2,,2`r`n3,,3`r`n4,,4`r`n5,,5`r`n6,,6`r`n7,,7`r`n8,,8`r`n9,,9`r`n0,,0", % cfg, utf-8 Loop Read, % cfg { If A_LoopReadLine contains `; continue If A_LoopReadLine=`r`n continue Loop Parse, A_LoopReadLine, CSV { If (A_Index=1) tab:=A_LoopField If (A_Index=2) tag:=A_LoopField If (A_Index=3) key:=A_LoopField } tab_%key%:=tab tag_%key%:=tag Hotkey % ">^>+" key, Note Hotkey IfWinActive, ahk_class Cinta.ModelessDialog Hotkey % ">^" key, Note Hotkey % ">+" key, Note Hotkey IfWinActive Hotkey % ">^>!" key, Open } n:=1, lng_string:=lng_1 Loop { n+=1 If lng_%n% lng_string.=A_Tab . lng_%n% If (n>20) break } return #IfWinActive ahk_class Cinta.ModelessDialog <^Space::Addtag(lctrl_space) >^Space::Addtag(rctrl_space) <+Space::Addtag(lshift_space) >+Space::Addtag(rshift_space) #IfWinActive Addtag(tt) { KeyWait Ctrl, T1 KeyWait Shift, T1 ControlGetText tag, Cinta.Edit2 s:=SubStr(tag,0) If (s=" ") StringTrimRight tag, tag, 1 ControlSetText Cinta.Edit2, % tag . tt " " Send {End} return } ;------------------------------------------------ >+F12:: text:=undo_text goto Int +MButton:: start_key:=2 WinGetActiveTitle source_title WinGet, source_id, ID, A ToolTip Правый клик в области выделения - подтверждение`nEscape или правый клик вне области выделения - отмена, % MRight*0.4, 0 MouseGetPos mx, my w:=MRight//5, h:=w//4, x:=mx-w//2, y:=my-h//2 Gui Destroy Gui +Lastfound +Resize AlwaysOnTop -Caption +Border +ToolWindow -DPIScale +MinSize60x20 Gui Color, % color Gui, Add, Text, w%w% h%h% guiMove WinSet Transparent, % opaque Gui, Show, x%x% y%y% w%w% h%h%, select_ocr_area While WinExist("select_ocr_area") { WinGetPos, , , ww, wh GuiControl, Move, Static1, w%ww% h%wh% Sleep 50 } return #IfWinActive select_ocr_area ahk_class AutoHotkeyGUI RButton:: KeyWait RButton, T1 Tooltip WinGetPos sx, sy, sw, sh, select_ocr_area MouseGetPos mx, my If (mx>sx && mx<sx+sw && my>sy && my<sy+sh) { Gui Destroy ToolTip goto OCR } GuiEscape: Gui Destroy Tooltip return #IfWinActive ahk_class AutoHotkeyGUI ^F12::goto 2ButtonCintaNotes #IfWinActive uiMove: PostMessage, 0xA1, 2,,, A return OCR: CaptureScreen(sx "|" sy "|" sw "|" sh,"ocr.png", 0, 0) Recogn: ToolTip Распознаю..., MRight/2, MBottom/2 RunWait % "Tesseract-OCR\tesseract.exe ocr.png ocr -l " lng, ,Min ToolTip Sleep 200 FileEncoding UTF-8-RAW FileRead text, ocr.txt text:=RegExReplace(text,"m)^(\s+|:|;|!|\?|\|)") text:=RegExReplace(text,"m)A_Space+$") text:=RegExReplace(text,"\s+$") text:=RegExReplace(text,"\R{2,}","`r`n") text:=RegExReplace(text,"(\.|,|:|;)(,|:|;)","$1") text:=RegExReplace(text," {1,3}(\.|,|:|;|!|\?|\)|]|})","$1") text:=RegExReplace(text,"(\.|,|:|;|!|\?)A_Space{2,3}","$1A_Space") text:=RegExReplace(text,"(\[|\{|\()A_Space{1,3}","$1") history:=text . A_Tab . history FormatTime dt, , dd.MM.yyyy HH:mm text:="`r`n### " dt " " CleanTitle(source_title,80) " ###`r`n" text "`r`n" text:=RegExReplace(old_text . text,"^\s+") Int: ed_w:=940+(MRight-1000)*0.25, ed_h:=MBottom*0.6, b_w:=(ed_w-64)//6, h_w:=b_w*3, u_w:=b_w//2, c_w:=u_w-8 Gui 2:Destroy Gui 2:-DPIScale +DelimiterTab Gui 2:Color, D7D7D7 Gui 2:Margin , 24 Gui 2:font, s%ft%, Arial Gui 2:Add, Edit, vtext w%ed_w% h%ed_h%,% text Gui 2:font Gui 2:font, s12 Gui 2:Add, Button, x60 y+8 w%b_w% h36 section, Canc&el Gui 2:Add, Button, x+0 wp hp, &Search Gui 2:Add, Button, x+0 wp hp, &Translate Gui 2:Add, DDL, x+0 yp+1 wp Sort Choose1 Uppercase vlng glng, % lng_string Gui 2:Add, Button, x+0 yp-1 wp h36, &Add to next Gui 2:Add, Button, x+0 wp hp, Cinta&Notes Gui 2:Add, DDL, x60 y+6 xs w%h_w% vhist gHistory, % history Gui 2:Add, Checkbox, x+8 yp-1 w%c_w% h36 vsep Checked%sep%, &Sep Gui 2:Add, Button,x+0 w%u_w% hp, &Undo Gui 2:Add, Button, x+0 w%b_w% hp, Delete old Gui 2:Add, Button, x+0 wp hp, &Copy Gui 2:Show, Center, % source_title GuiControl 2:ChooseString, ComboBox1, % lng Send ^{End} return 2ButtonCancel: 2GuiEscape: 2GuiClose: Gui 2:Submit undo_text:=text FileDelete ocr.* return 2ButtonSearch: Gui 2:Submit, NoHide ControlGet text, Selected, ,Edit1 If !text { MsgBox, 262160, Ошибка, Ничего не выделено!, 1 return } url:=search StringReplace url, url, http:// StringReplace url, url, https:// url:="http://" url StringReplace url, url, `%s, % text Run % url text:="" return 2ButtonTranslate: Gui 2:Submit, NoHide text:=RegExReplace(text,"\R?### .+? ###\R","") url:=translate StringReplace url, url, http:// StringReplace url, url, https:// url:="http://" url StringReplace url, url, `%s, % text Run % url return lng: Gui 2:Submit If !text return text:=RegExReplace(text,"^.*###\R","") history:=text . A_Tab . history goto Recogn 2ButtonUndo: Gui 2:Submit, NoHide If !undo_text return text:=RegExReplace(undo_text,"\R","`r`n") ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI return Sep: sep:=!sep return 2ButtonAddtonext: Gui 2:Submit undo_text:=old_text:=text FileDelete ocr.* return 2ButtonCintaNotes: Gui 2:Submit, NoHide undo_text:=text, old_text:="" KeyWait LButton, T1 text:=RegExReplace(text,"^\R+") If !sep text:=RegExReplace(text,"\R?### .+? ###\R","") text:=RegExReplace(text,"\R","`r`n") ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI ControlFocus Edit1 ControlSend Edit1, ^{vk41} FileDelete ocr.* KeyWait Ctrl, T1 Send ^{F12} WinWaitActive ahk_class Cinta.ModelessDialog, , 10 Sleep 1000 Gui 2:Submit return 2ButtonDeleteold: Gui 2:Submit, NoHide text:=RegExReplace(text,"^.*(?=\R?### .+? ###)","") text:=RegExReplace(text,"\R","`r`n") ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI old_text:="" return History: Gui 2:Submit, NoHide Clipboard:=hist GuiControl Choose, ComboBox2, OCR history ToolTip Текст в буфере! Sleep 700 ToolTip return 2ButtonCopy: Gui 2:Submit, NoHide text:=RegExReplace(text,"^\R+") If !sep text:=RegExReplace(text,"\R?### .+? ###\R","") Clipboard:=text ToolTip Тект в буфере! Sleep 700 ToolTip return ;--------------------------------- Note: KeyWait RShift, T1 KeyWait RCtrl, T0.7 ctrl_delay:=ErrorLevel clip_old:=Clipboard, old_tag:="", site_add:="", site_text:="" IfWinActive select_ocr_area ahk_class AutoHotkeyGUI Exit IfWinActive %source_title% ahk_class AutoHotkeyGUI { Gui 2:Submit, NoHide old_text:="", undo_text:=text text:=RegExReplace(text,"^\R+") If !sep text:=RegExReplace(text,"\R?### .+? ###\R","") ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI ControlFocus Edit1 ControlSend Edit1, ^{vk41} FileDelete ocr.* } else { WinGetActiveTitle source_title WinGet, source_id, ID, A } gosub GetTag If tag contains $time { Gui 3:Destroy Gui 3:+AlwaysOnTop Gui 3:Margin , 5, 5 Gui 3:font, s12 Gui 3:Add, Text, , используя курсорные клавиши и календарь (Alt+Down) Gui 3:Add, DateTime ,wp+0 vDateTime, yyyy MMMM dd, dddd HH:mm Gui 3:Add, Button, y5 r2 w60 Default, OK Gui 3:Show, Center, Введите дату и время return } Last_add: If A_ThisHotkey contains >^>+ { KeyWait RCtrl, T1.5 SendEvent ^{F12} WinWaitNotActive % "ahk_id " source_id, , 5 WinWaitActive ahk_class Cinta.ModelessDialog, , 10 } If A_ThisHotkey contains >^ { Control Choose, % tab, Cinta.Combobox1, ahk_class Cinta.ModelessDialog end:="" If ctrl_delay end:=ctrl_tag ControlSetText Cinta.Edit2, % tag . end " " If A_ThisHotkey not contains + return } else { SendMessage, 0x147, 0, 0, Cinta.Combobox1 stab:=ErrorLevel+1 If (stab<>tab) { MsgBox, 262160, Ошибка, Тэг относится к другой секции!, 1.5 return } ControlGetText old_tag, Cinta.Edit2 s:=SubStr(old_tag,0) If (s=" ") StringTrimRight old_tag, old_tag, 1 ControlSetText Cinta.Edit2, % old_tag " " tag " " Send {End} return } If start_tag contains $file { ControlSetText Cinta.Edit1, % "File: " f_path ControlSetText Cinta.RichEdit1 } If start_tag contains $site { ControlSetText Cinta.Edit3, % site_add ControlSetText Cinta.RichEdit1, % site_text } ControlGetText add, Cinta.Edit3, ahk_class Cinta.ModelessDialog If add && link2rem ControlSetText Cinta.RichEdit2, % add If ! add && f_path { If link2rem ControlSetText Cinta.RichEdit2, % f_path If dir_path SplitPath f_path, , f_path ControlSetText Cinta.Edit3, % f_path } ControlGetText n_txt, Cinta.RichEdit1 n_txt:=RegExReplace(n_txt,"^\R+","") If end_note n_txt:=RegExReplace(n_txt,"s)(" end_note ").+$","") n_txt:=MaxEmptyString(n_txt,max_empty_str) ControlSetText Cinta.RichEdit1, % n_txt If start_tag contains $dict { RegExMatch(n_txt,"^.+?(?=(\R| - |\s{3,}|\||;|\{|\(|\[))",term) term:=RegExReplace(term,"^\s+(?=\w)","") ControlSetText Cinta.Edit1,% term StringLeft term, term, 1 StringUpper term, term StringReplace tag, tag, $dict, % term ControlSetText Cinta.Edit2, % tag } If (clip>0 && n_txt<>"") { If (clip=2) { Loop parse, n_txt, `n, `r { If (A_LoopField="") continue n_txt:=A_LoopField break } n_txt:=ValidName(n_txt) } Clipboard:=n_txt } else Clipboard:=clip_old Last_tag: Gui 2:Submit Loop { SendMessage, 0x147, 0, 0, Cinta.Combobox1, ahk_class Cinta.ModelessDialog tab:=ErrorLevel+1 ControlGetText tag, Cinta.Edit2 sl:=SubStr(tag,0) If (sl=" ") StringTrimRight tag, tag, 1 Sleep 100 If (zt && n_txt && A_Index=10) Send ^{Enter} IfWinNotActive ahk_class Cinta.ModelessDialog break } return ;-------------------------- 3ButtonOK: Gui 3: Submit FormatTime DateTime, % DateTime, % t_tree . "/HH:mm" StringReplace tag, tag, $time, % DateTime WinActivate % source_title goto Last_add 3GuiClose: 3GuiEscape: Gui 3: Cancel return Open: gosub GetTag FormatTime DateTime, , % t_tree StringReplace tag, tag, $time, % DateTime StringReplace tag, tag, /$dict StringReplace tag, tag, $dict Last_open: KeyWait Alt, T1 KeyWait RCtrl, T1 KeyWait Space, T1 IfWinNotActive ahk_class CintaNotes.MainFrame { SendEvent ^!{F12} WinWait ahk_class CintaNotes.MainFrame, , 3 If ErrorLevel return } Send ^{%tab%} Sleep 600 If tag { ControlSetText Cinta.Edit1, % tag ControlSend Cinta.Edit1, {Enter} Sleep 200 Send {Home} } KeyWait Alt, T1 If Errorlevel Send {Alt Up} return GetTag: RegExMatch(A_ThisHotkey,"[^\^\+!>]+$",key) tab:=tab_%key% tag:=tag_%key% f_path:="", start_tag:=tag, zt:="" If tag contains $cmd,$cmt { f_path:=GetPath("ahk_id " source_id) If !f_path { If tag contains $cmt goto Title MsgBox, 262160, Ошибка, Путь файла недоступен!, 1.5 Exit } SplitPath f_path, , , , $cmd $cmd:=ValidName($cmd,"_") StringReplace tag, tag, $cmd, % $cmd StringReplace tag, tag, $cmt, % $cmd } Title: If tag contains $title,$cmt { $title:=ValidName(CleanTitle(source_title),"_") StringReplace tag, tag, $title, % $title StringReplace tag, tag, $cmt, % $title } WinGet $proc, ProcessName, % "ahk_id " source_id SplitPath $proc, , , , $proc StringUpper $proc, $proc, T StringReplace tag, tag, $proc, % ValidName($proc,"_") If tag contains $file { Clipboard:="" Send ^{vk43} ClipWait 2 f_path:=Clipboard path_exist:=RegExMatch(f_path,"i)[a-z]:\\.+?\.[a-z0-9]{2,4}") If !path_exist { MsgBox, 262160, Ошибка, Путь недоступен!, 1.5 Exit } SplitPath f_path, $file StringReplace tag, tag, $file, % ValidName($file,"_") } If tag contains $site { If A_Thishotkey contains >^ { Clipboard:="" Send ^{Ins} ClipWait 2 site_text:=Clipboard Sleep 300 } Clipboard:="" Send ^{vk4C} Sleep 500 Send ^{Ins} ClipWait 2 site_add:=Clipboard RegExMatch(site_add,"(?<=//).+?(?=/)",$site) If !$site { MsgBox, 262160, Ошибка, Адрес недоступен!, 1.5 Exit } StringReplace tag, tag, $site, % $site } If tag contains $z { StringReplace tag, tag, $z zt:=1 } return ;------------------------- FirstUppercase(t) { StringLeft n, t, 1 StringTrimLeft k, t, 1 StringUpper n, n return n . k } CleanTitle(t,l="") { global RegExMatch(t,"i)[a-z]:\\.+?\.[a-z0-9]{2,4}",f_path) title:=f_path If !title RegExMatch(t,"i)(?<=\[).+\.[a-z0-9]{2,4}(?=])",title) If !title RegExMatch(t,"i)^.+\.[a-z0-9]{2,4}(?= - )",title) If !title RegExMatch(t,"i)(?<= - ).+\.[a-z0-9]{2,4}$",title) SplitPath title, , , ,title If !title RegExMatch(t,"^.+(?= - )",title) If !title title:=t If l { ln:=StrLen(title) If (ln>l-3) { StringLeft title, title, % l StringGetPos pos, title,% " ", R If !Errorlevel StringLeft title, title, % pos title:=title "..." } } return title } GetPath(title) { WinGet pr, ProcessName, % title Process, Exist, % pr pid := ErrorLevel for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process") If (process.ProcessId = pid) cmdline := process.CommandLine If cmdline contains Explorer.exe cmdline:="" fp:=RegExMatch(cmdline,"i)[a-z]:\\.*\.[a-z0-9]{2,5}",f_path,6) return f_path } MaxEmptyString(text,max) { n:="" Loop % max+1 n.="`r`n" text:=RegExReplace(text,"(?<=.)\R{" max+2 ",}(?=.)",n) return text } ValidName(n,r="") { n:=RegExReplace(n,"(:|;|,|\*|\?|\\|/|<|>|"")"," ") n:=RegExReplace(n,"\s+"," ") StringReplace n, n, |, -, All If r StringReplace n, n, % " ", % r, All return Trim(n) } ;--------- GDI+ ---------- CaptureScreen(aRect, sFile, nQuality, Cursor) { pToken := Startup() pBitmap := BitmapFromScreen(aRect, Cursor) If sFile = 0 SetBitmapToClipboard(pBitmap) Else SaveBitmapToFile(pBitmap, sFile, nQuality) DllCall("gdiplus\GdipDisposeImage", UInt, pBitmap) Shutdown(pToken) } BitmapFromScreen(Screen=0, Raster="") { if (Screen = 0) { Sysget, x, 76 Sysget, y, 77 Sysget, w, 78 Sysget, h, 79 } else if (SubStr(Screen, 1, 5) = "hwnd:") { Screen := SubStr(Screen, 6) if !WinExist( "ahk_id " Screen) return -2 WinGetPos,,, w, h, ahk_id %Screen% x := y := 0 hhdc := GetDCEx(Screen, 3) } else if (Screen&1 != "") { Sysget, M, Monitor, %Screen% x := MLeft, y := MTop, w := MRight-MLeft, h := MBottom-MTop } else { StringSplit, S, Screen, | x := S1, y := S2, w := S3, h := S4 } if (x = "") || (y = "") || (w = "") || (h = "") return -1 chdc := CreateCompatibleDC(), hbm := CreateDIBSection(w, h, chdc), obm := SelectObject(chdc, hbm), hhdc := hhdc ? hhdc : GetDC() BitBlt(chdc, 0, 0, w, h, hhdc, x, y, Raster) ReleaseDC(hhdc) pBitmap := CreateBitmapFromHBITMAP(hbm) SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc) return pBitmap } CreateBitmapFromHBITMAP(hBitmap, Palette=0) { Ptr := A_PtrSize ? "UPtr" : "UInt" DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", Ptr, hBitmap, Ptr, Palette, A_PtrSize ? "UPtr*" : "uint*", pBitmap) return pBitmap } SaveBitmapToFile(pBitmap, sOutput, Quality=75) { Ptr := A_PtrSize ? "UPtr" : "UInt" SplitPath, sOutput,,, Extension if Extension not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG return -1 Extension := "." Extension DllCall("gdiplus\GdipGetImageEncodersSize", "uint*", nCount, "uint*", nSize) VarSetCapacity(ci, nSize) DllCall("gdiplus\GdipGetImageEncoders", "uint", nCount, "uint", nSize, Ptr, &ci) if !(nCount && nSize) return -2 If (A_IsUnicode){ StrGet_Name := "StrGet" Loop, %nCount% { sString := %StrGet_Name%(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), "UTF-16") if !InStr(sString, "*" Extension) continue pCodec := &ci+idx break } } else { Loop, %nCount% { Location := NumGet(ci, 76*(A_Index-1)+44) nSize := DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "uint", 0, "int", 0, "uint", 0, "uint", 0) VarSetCapacity(sString, nSize) DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "str", sString, "int", nSize, "uint", 0, "uint", 0) if !InStr(sString, "*" Extension) continue pCodec := &ci+76*(A_Index-1) break } } if !pCodec return -3 if (Quality != 75) { Quality := (Quality < 0) ? 0 : (Quality > 100) ? 100 : Quality if Extension in .JPG,.JPEG,.JPE,.JFIF { DllCall("gdiplus\GdipGetEncoderParameterListSize", Ptr, pBitmap, Ptr, pCodec, "uint*", nSize) VarSetCapacity(EncoderParameters, nSize, 0) DllCall("gdiplus\GdipGetEncoderParameterList", Ptr, pBitmap, Ptr, pCodec, "uint", nSize, Ptr, &EncoderParameters) Loop, % NumGet(EncoderParameters, "UInt") ;% { elem := (24+(A_PtrSize ? A_PtrSize : 4))*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0) if (NumGet(EncoderParameters, elem+16, "UInt") = 1) && (NumGet(EncoderParameters, elem+20, "UInt") = 6) { p := elem+&EncoderParameters-pad-4 NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, "UInt")), "UInt") break } } } } if (!A_IsUnicode) { nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &sOutput, "int", -1, Ptr, 0, "int", 0) VarSetCapacity(wOutput, nSize*2) DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &sOutput, "int", -1, Ptr, &wOutput, "int", nSize) VarSetCapacity(wOutput, -1) if !VarSetCapacity(wOutput) return -4 E := DllCall("gdiplus\GdipSaveImageToFile", Ptr, pBitmap, Ptr, &wOutput, Ptr, pCodec, "uint", p ? p : 0) } else E := DllCall("gdiplus\GdipSaveImageToFile", Ptr, pBitmap, Ptr, &sOutput, Ptr, pCodec, "uint", p ? p : 0) return E ? -5 : 0 } SetBitmapToClipboard(pBitmap) { Ptr := A_PtrSize ? "UPtr" : "UInt" off1 := A_PtrSize = 8 ? 52 : 44, off2 := A_PtrSize = 8 ? 32 : 24 hBitmap := CreateHBITMAPFromBitmap(pBitmap) DllCall("GetObject", Ptr, hBitmap, "int", VarSetCapacity(oi, A_PtrSize = 8 ? 104 : 84, 0), Ptr, &oi) hdib := DllCall("GlobalAlloc", "uint", 2, Ptr, 40+NumGet(oi, off1, "UInt"), Ptr) pdib := DllCall("GlobalLock", Ptr, hdib, Ptr) DllCall("RtlMoveMemory", Ptr, pdib, Ptr, &oi+off2, Ptr, 40) DllCall("RtlMoveMemory", Ptr, pdib+40, Ptr, NumGet(oi, off2 - (A_PtrSize ? A_PtrSize : 4), Ptr), Ptr, NumGet(oi, off1, "UInt")) DllCall("GlobalUnlock", Ptr, hdib) DllCall("DeleteObject", Ptr, hBitmap) DllCall("OpenClipboard", Ptr, 0) DllCall("EmptyClipboard") DllCall("SetClipboardData", "uint", 8, Ptr, hdib) DllCall("CloseClipboard") } BitBlt(ddc, dx, dy, dw, dh, sdc, sx, sy, Raster="") { Ptr := A_PtrSize ? "UPtr" : "UInt" return DllCall("gdi32\BitBlt" , Ptr, dDC , "int", dx , "int", dy , "int", dw , "int", dh , Ptr, sDC , "int", sx , "int", sy , "uint", Raster ? Raster : 0x00CC0020) } CreateHBITMAPFromBitmap(pBitmap, Background=0xffffffff) { DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", A_PtrSize ? "UPtr" : "UInt", pBitmap, A_PtrSize ? "UPtr*" : "uint*", hbm, "int", Background) return hbm } CreateCompatibleDC(hdc=0) { return DllCall("CreateCompatibleDC", A_PtrSize ? "UPtr" : "UInt", hdc) } CreateDIBSection(w, h, hdc="", bpp=32, ByRef ppvBits=0) { Ptr := A_PtrSize ? "UPtr" : "UInt" hdc2 := hdc ? hdc : GetDC() VarSetCapacity(bi, 40, 0) NumPut(w, bi, 4, "uint") , NumPut(h, bi, 8, "uint") , NumPut(40, bi, 0, "uint") , NumPut(1, bi, 12, "ushort") , NumPut(0, bi, 16, "uInt") , NumPut(bpp, bi, 14, "ushort") hbm := DllCall("CreateDIBSection" , Ptr, hdc2 , Ptr, &bi , "uint", 0 , A_PtrSize ? "UPtr*" : "uint*", ppvBits , Ptr, 0 , "uint", 0, Ptr) if !hdc ReleaseDC(hdc2) return hbm } DeleteDC(hdc) { return DllCall("DeleteDC", A_PtrSize ? "UPtr" : "UInt", hdc) } DeleteObject(hObject) { return DllCall("DeleteObject", A_PtrSize ? "UPtr" : "UInt", hObject) } GetDC(hwnd=0) { return DllCall("GetDC", A_PtrSize ? "UPtr" : "UInt", hwnd) } GetDCEx(hwnd, flags=0, hrgnClip=0) { Ptr := A_PtrSize ? "UPtr" : "UInt" return DllCall("GetDCEx", Ptr, hwnd, Ptr, hrgnClip, "int", flags) } ReleaseDC(hdc, hwnd=0) { Ptr := A_PtrSize ? "UPtr" : "UInt" return DllCall("ReleaseDC", Ptr, hwnd, Ptr, hdc) } SelectObject(hdc, hgdiobj) { Ptr := A_PtrSize ? "UPtr" : "UInt" return DllCall("SelectObject", Ptr, hdc, Ptr, hgdiobj) } Startup() { Ptr := A_PtrSize ? "UPtr" : "UInt" if !DllCall("GetModuleHandle", "str", "gdiplus", Ptr) DllCall("LoadLibrary", "str", "gdiplus") VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1) DllCall("gdiplus\GdiplusStartup", A_PtrSize ? "UPtr*" : "uint*", pToken, Ptr, &si, Ptr, 0) return pToken } Shutdown(pToken) { Ptr := A_PtrSize ? "UPtr" : "UInt" DllCall("gdiplus\GdiplusShutdown", Ptr, pToken) if hModule := DllCall("GetModuleHandle", "str", "gdiplus", Ptr) DllCall("FreeLibrary", Ptr, hModule) return 0 } |