Jump to content

SmartNote is a screen snip tool to take fast note with OCR ability from Tesseract 100+ languages


Recommended Posts

SmartNote is a screen snip tool to take fast note with OCR ability from Tesseract 100+ languages

Of course you will have to install it first. https://github.com/UB-Mannheim/tesseract/wiki

I tried it with the version of 32bit tesseract-ocr-w32-setup-v5.2.0.20220712.exe

in Windows 10 Pro 64-bit 21H2

 

as default with ALT_key and Left_mouse_button snipe the note

 

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=mmcndmgr-106.ico
#AutoIt3Wrapper_Outfile=SmartNote.exe
#AutoIt3Wrapper_Res_Description=SmartNote screen snip & Tesserac ocr
#AutoIt3Wrapper_Res_Fileversion=1.0.0.3
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_ProductName=SmartNote.au3
#AutoIt3Wrapper_Res_ProductVersion=1.0.0.0
#AutoIt3Wrapper_Res_CompanyName=ioa747
#AutoIt3Wrapper_Res_LegalCopyright=Free with regards of AutoIT forum
#AutoIt3Wrapper_Run_Tidy=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;~ ScriptName=SmartNote.au3

#include <MsgBoxConstants.au3>
#include <ScreenCapture.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <TrayConstants.au3>
#include <Misc.au3>
#include <Array.au3>

;tray entry to exit script
Opt("TrayMenuMode", 3) ;0=append, 1=no default menu, 2=no automatic check, 4=menuitemID  not return
Opt("TrayOnEventMode", 1) ; Enable TrayOnEventMode.
TrayCreateItem("Exit")
TrayItemSetOnEvent(-1, "ExitScript")
TraySetIcon("mmcndmgr.dll", -106)

Local $mPos, $gPos[4], $Active_title, $ghost_gui, $block_gui, $Active_hWnd
;~ array to hold the Contextmenu data
Local $NoteGui[1][10]

$NoteGui[0][0] = 0 ; Note_Handle cnt
$NoteGui[0][1] = "jpgPath"
$NoteGui[0][2] = "ID_PicCtrl"
$NoteGui[0][3] = "ID_ContextMenu"
$NoteGui[0][4] = "ID_cMenuCopy"
$NoteGui[0][5] = "ID_cMenuSave"
$NoteGui[0][6] = "ID_cMenuOpen"
$NoteGui[0][7] = "ID_cMenuOCR-eng"
$NoteGui[0][8] = "ID_cMenuOCR-eng+ell"
$NoteGui[0][9] = "ID_cMenuClose"

;~ HotKeySet("{PGUP}", "NoteGui_display") ;<|<|<|<|<|<|<|<|<| contex array info

; make ghost gui
$ghost_gui = GUICreate("ghost_gui", 100, 100, 1, 1, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
GUISetBkColor("0xFFFF00") ; $COLOR_YELLOW
WinSetTrans($ghost_gui, "", 50)

; make mouse block gui
$block_gui = GUICreate("ghost_gui", 100, 100, 1, 1, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
WinSetTrans($block_gui, "", 1)

; Check for leftover files
Local $iFileExists = FileExists(@ScriptDir & "\tmp")
If $iFileExists Then
    FileDelete(@ScriptDir & "\tmp\*.*")
Else
    DirCreate(@ScriptDir & "\tmp")
EndIf

; loop until program exit
;*********************************************************************************************
While 1

    $Active_title = WinGetTitle("[ACTIVE]")
    $Active_hWnd = WinGetHandle($Active_title)

    ; whait ALT_key and Left_mouse_button _IsPressed
    If _IsPressed("12") And _IsPressed("01") Then  ; for create new note
        $mPos = MouseGetPos()
        $gPos[0] = $mPos[0]
        $gPos[1] = $mPos[1]

        ; Wait until key is released.
        While _IsPressed("01")
            Sleep(250)

            $mPos = MouseGetPos()
            $gPos[2] = $mPos[0]
            $gPos[3] = $mPos[1]

            ; show ghost gui
            GUISetState(@SW_SHOW, $ghost_gui)
            WinMove($ghost_gui, "", $gPos[0], $gPos[1], $gPos[2] - $gPos[0], $gPos[3] - $gPos[1])

            ; show ghost gui
            GUISetState(@SW_SHOW, $block_gui)
            WinMove($block_gui, "", $mPos[0] - 50, $mPos[1] - 50)
        WEnd

        GUISetState(@SW_HIDE, $ghost_gui)
        GUISetState(@SW_HIDE, $block_gui)
        CreateNew_NoteGui($gPos)  ; create new note

    EndIf

    $Active_title = WinGetTitle("[ACTIVE]")
    $Active_hWnd = WinGetHandle($Active_title)

    $aMsg = GUIGetMsg()
    If $aMsg = 0 Or $aMsg = $GUI_EVENT_MOUSEMOVE Then ContinueLoop
    Switch $aMsg

        ; Copy to Clipboard
        Case 6, 17, 28, 39, 50, 61, 72, 83, 94, 105, 116, 127, 138, 149, 160, 171, 182, 193, 204, 215, 226, 237, 248, 259, 270, 281, 292, 303, 314, 325, 336, 347, 358
            _PicToClip($Active_title)

            ; Save as...
        Case 7, 18, 29, 40, 51, 62, 73, 84, 95, 106, 117, 128, 139, 150, 161, 172, 183, 194, 205, 216, 227, 238, 249, 260, 271, 282, 293, 304, 315, 326, 337, 348, 359
            SaveFileDlg()

            ; Open
        Case 8, 19, 30, 41, 52, 63, 74, 85, 96, 107, 118, 129, 140, 151, 162, 173, 184, 195, 206, 217, 228, 239, 250, 261, 272, 283, 294, 305, 316, 327, 338, 349, 360
            ShellExecute($Active_title)

            ; OCR - eng
        Case 10, 21, 32, 43, 54, 65, 76, 87, 98, 109, 120, 131, 142, 153, 164, 175, 186, 197, 208, 219, 230, 241, 252, 263, 274, 285, 296, 307, 318, 329, 340, 351, 362
            _Tesserac($Active_title, "eng")

            ; OCR - eng + ell
        Case 11, 22, 33, 44, 55, 66, 77, 88, 99, 110, 121, 132, 143, 154, 165, 176, 187, 198, 209, 220, 231, 242, 253, 264, 275, 286, 297, 308, 319, 330, 341, 352, 363
            _Tesserac($Active_title, "eng+ell")

            ; Close
        Case 13, 24, 35, 46, 57, 68, 79, 90, 101, 112, 123, 134, 145, 156, 167, 178, 189, 200, 211, 222, 233, 244, 255, 266, 277, 288, 299, 310, 321, 332, 343, 354, 365
            Local $strLen = StringLen(@ScriptDir & "\tmp\image_")
            If StringLeft($Active_title, $strLen) = @ScriptDir & "\tmp\image_" Then
                GUIDelete($Active_hWnd)
                FileDelete($Active_title)
                NoteGui_DeleteBy_cMenuClose($aMsg)
                ConsoleWrite("- WinClose " & $Active_hWnd & " & FileDelete " & $Active_title & @CRLF)
            EndIf

    EndSwitch

WEnd
;*********************************************************************************************

;--------------------------------------------------------------------------------------------
Func ExitScript()  ; exit program
    Exit
EndFunc   ;==>ExitScript
;--------------------------------------------------------------------------------------------
Func CreateNew_NoteGui($gPos)  ; create new note gui
;~  ;$NoteGui[0][0] = Note_Handle
;~  ;$NoteGui[0][1] = jpgPath
;~  ;$NoteGui[0][2] = ID_PicCtrl
;~  ;$NoteGui[0][3] = ID_ContextMenu
;~  ;$NoteGui[0][4] = ID_cMenuClose
;~  ;$NoteGui[0][5] = ID_cMenuSave
;~  ;$NoteGui[0][6] = ID_
;~  ;$NoteGui[0][7] = ID_
;~  ;$NoteGui[0][8] = ID_
;~  ;$NoteGui[0][9] = ID_

    Local $n, $gW, $gH

    ReDim $NoteGui[UBound($NoteGui) + 1][10]
    $NoteGui[0][0] += 1

    $n = $NoteGui[0][0]

    $gW = $gPos[2] - $gPos[0]
    $gH = $gPos[3] - $gPos[1]

    ; create note GUI
    $NoteGui[$n][0] = GUICreate($NoteGui[$n][1], $gW, $gH, $gPos[0], $gPos[1], $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))

    ; jpg Path for _ScreenCapture_Capture
    $NoteGui[$n][1] = @ScriptDir & "\tmp\image_" & $NoteGui[$n][0] & ".jpg"
    _ScreenCapture_Capture($NoteGui[$n][1], $gPos[0], $gPos[1], $gPos[2], $gPos[3])

    ; set jpg Path as GUI title
    WinSetTitle($NoteGui[$n][0], "", $NoteGui[$n][1])

    $NoteGui[$n][2] = GUICtrlCreatePic($NoteGui[$n][1], 0, 0, 0, 0, -1, $GUI_WS_EX_PARENTDRAG)
    GUICtrlCreateLabel("", 0, 0, $gW, $gH, $SS_GRAYFRAME)  ;just for $SS_GRAYFRAME

    ; Creates a context menu
    $NoteGui[$n][3] = GUICtrlCreateContextMenu($NoteGui[$n][2])
    ; MenuItem for the context menu
    $NoteGui[$n][4] = GUICtrlCreateMenuItem("Copy to Clipboard", $NoteGui[$n][3])
    $NoteGui[$n][5] = GUICtrlCreateMenuItem("Save as...", $NoteGui[$n][3])
    $NoteGui[$n][6] = GUICtrlCreateMenuItem("Open", $NoteGui[$n][3])
    GUICtrlCreateMenuItem("", $NoteGui[$n][3]) ; separator
    $NoteGui[$n][7] = GUICtrlCreateMenuItem("OCR - eng", $NoteGui[$n][3])
    $NoteGui[$n][8] = GUICtrlCreateMenuItem("OCR - eng+ell", $NoteGui[$n][3])
    GUICtrlCreateMenuItem("", $NoteGui[$n][3]) ; separator
    $NoteGui[$n][9] = GUICtrlCreateMenuItem("Close", $NoteGui[$n][3])

    ; Display the GUI.
    GUISetState(@SW_SHOW, $NoteGui[$n][0])

    Return $NoteGui[$n][0]

EndFunc   ;==>CreateNew_NoteGui
;--------------------------------------------------------------------------------------------
Func SaveFileDlg() ; Save file Dialog
    ; Create a constant variable in Local scope of the message to display in FileSaveDialog.
    Local Const $sMessage = "Choose a filename."

    ; Display a save dialog to select a file.
    Local $sFileSaveDialog = FileSaveDialog($sMessage, @ScriptDir & "\SET\", "image (*.jpg)", $FD_PATHMUSTEXIST)
    If @error Then
        ; Display the error message.
        ;MsgBox($MB_SYSTEMMODAL, "", "No file was saved.")
    Else
        ; Retrieve the filename from the filepath e.g. Example.jpg
        Local $sFileName = StringTrimLeft($sFileSaveDialog, StringInStr($sFileSaveDialog, "\", $STR_NOCASESENSEBASIC, -1))

        ; Check if the extension .jpg is appended to the end of the filename.
        Local $iExtension = StringInStr($sFileName, ".", $STR_NOCASESENSEBASIC)

        ; If a period (dot) is found then check whether or not the extension is equal to .jpg
        If $iExtension Then
            ; If the extension isn't equal to .jpg then append to the end of the filepath.
            If Not (StringTrimLeft($sFileName, $iExtension - 1) = ".jpg") Then $sFileSaveDialog &= ".jpg"
        Else
            ; If no period (dot) was found then append to the end of the file.
            $sFileSaveDialog &= ".jpg"
        EndIf

        ; Display the saved file.
        ConsoleWrite("You saved the following file:" & @CRLF & $sFileSaveDialog & @CRLF)

        FileCopy($Active_title, $sFileSaveDialog, $FC_OVERWRITE + $FC_CREATEPATH)

    EndIf
EndFunc   ;==>SaveFileDlg
;--------------------------------------------------------------------------------------------
Func NoteGui_display()
    _ArrayDisplay($NoteGui, "$NoteGui")
EndFunc   ;==>NoteGui_display
;--------------------------------------------------------------------------------------------
Func NoteGui_DeleteBy_cMenuClose($cMenuClose) ; NoteGui_DeleteBy_cMenuClose
    For $i = 1 To $NoteGui[0][0]
        If $cMenuClose = $NoteGui[$i][4] Then
            ExitLoop
        EndIf
    Next
    _ArrayDelete($NoteGui, $i)
    $NoteGui[0][0] -= 1
EndFunc   ;==>NoteGui_DeleteBy_cMenuClose
;--------------------------------------------------------------------------------------------
Func _PicToClip($Path) ; use ms-paint to copy image to clipboard
    Local $aPos = WinGetPos("[ACTIVE]")
    ShellExecute(@WindowsDir & "\system32\mspaint.exe", $Path, "", "open", @SW_HIDE)

    Local $MsPaint
    $MsPaint = WinWait("[CLASS:MSPaintApp]")
    WinActivate($MsPaint)
    Send("^a")
    Send("^c")
    WinClose($MsPaint)
EndFunc   ;==>_PicToClip
;--------------------------------------------------------------------------------------------
Func _Tesserac($ImagePath, $lang) ; perform ocr
    ; thanks to JohnOne https://www.autoitscript.com/forum/topic/174483-tesseract-simple-example/
    ; more info at https://tesseract-ocr.github.io/tessdoc/Command-Line-Usage.html#simplest-invocation-to-ocr-an-image
    Local $ResultTextPath, $OutPutPath, $TesseractExePath, $Result
    $ResultTextPath = @ScriptDir & "\Result"
    $OutPutPath = $ResultTextPath & ".txt"
    $TesseractExePath = "C:\Program Files (x86)\Tesseract-OCR\tesseract.exe"

    ShellExecuteWait($TesseractExePath, '"' & $ImagePath & '" "' & $ResultTextPath & '" -l ' & $lang & ' --psm 6', "", "", @SW_HIDE)
    ConsoleWrite($TesseractExePath & ' "' & $ImagePath & '" "' & $ResultTextPath & '" -l ' & $lang & ' --psm 6' & @CRLF)

    If @error Then
        Exit MsgBox($MB_OK + $MB_TOPMOST + $MB_ICONERROR, "Error", @error)
    EndIf

    $Result = FileRead($OutPutPath)

    MsgBox($MB_OK + $MB_TOPMOST, "OCR Result", $Result)
    ClipPut($Result)
    $mPos = MouseGetPos()
    ToolTip("The text was copied to the clipboard", $mPos[0] - 50, $mPos[1] - 20)
    Sleep(2000)
    ToolTip("")

    FileDelete($OutPutPath)
EndFunc   ;==>_Tesserac

 

the topic from

was helpful for this. Thanks for sharing it

 

I met some issues

One is that I didn't find out how to put image to clipboard from file

and I use the ms-paint for this

 

and the other is with the context menu array

I don't know if there is a more efficient way to handle it

If anyone knows and wants it

 

Please, leave your comments and experiences here.

Edited by ioa747
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...