ioa747 Posted March 25, 2023 Share Posted March 25, 2023 (edited) SmartNote is a screen snip tool to take fast Screenshot (Note) with OCR ability from Tesseractfor create new note ALT_key and Left_mouse_button 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 expandcollapse popup#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 ;~ ScriptName=SmartNote2.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) Global $mPos, $gPos[4], $Active_title, $ghost_gui, $block_gui, $Active_hWnd Global $hDLL = DllOpen("user32.dll") ;~ array to hold the Contextmenu data Global $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", 200, 200, 1, 1, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST)) WinSetTrans($block_gui, "", 0) ; Check for leftover files Global $iFileExists = FileExists(@ScriptDir & "\tmp") If $iFileExists Then FileDelete(@ScriptDir & "\tmp\*.*") Else DirCreate(@ScriptDir & "\tmp") EndIf ; loop until program exit Global $aMsg, $strLen ;********************************************************************************************* While 1 $Active_title = WinGetTitle("[ACTIVE]") $Active_hWnd = WinGetHandle($Active_title) ; whait ALT_key and Left_mouse_button _IsPressed ; * <-- ; for create new note ALT_key and Left_mouse_button ; * <-- If _IsPressed("12", $hDLL) And _IsPressed("01", $hDLL) Then $mPos = MouseGetPos() $gPos[0] = $mPos[0] $gPos[1] = $mPos[1] ; Wait until mouse key is released. While _IsPressed("01", $hDLL) 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] - 100, $mPos[1] - 100) 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 ; More LangCode --> https://tesseract-ocr.github.io/tessdoc/Data-Files-in-different-versions.html _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 $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 DllClose($hDLL) 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 ;~ ; More LangCode --> https://tesseract-ocr.github.io/tessdoc/Data-Files-in-different-versions.html ;~ ; 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 ;~ ; Of course you will have to install it first. --> https://github.com/UB-Mannheim/tesseract/wiki ;~ ; I tried it in Windows 10 Pro 64-bit with the version of 32bit --> https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w32-setup-v5.2.0.20220712.exe 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 Edited March 25, 2023 by ioa747 I know that I know nothing Link to comment Share on other sites More sharing options...
Solution Nine Posted March 25, 2023 Solution Share Posted March 25, 2023 (edited) Maybe this ? #include <GDIPlus.au3> #include <Clipboard.au3> _GDIPlus_Startup() Local $hImage = _GDIPlus_ImageLoadFromFile("torus.jpg") Local $hBitmap1 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) _GDIPlus_ImageDispose($hImage) Local $hBitmap2 = _WinAPI_CopyImage($hBitmap1, $IMAGE_BITMAP, 0, 0, $LR_COPYDELETEORG+$LR_COPYRETURNORG) _WinAPI_DeleteObject($hBitmap1) _GDIPlus_Shutdown() _ClipBoard_Open(0) _ClipBoard_Empty() _ClipBoard_SetDataEx( $hBitmap2, $CF_BITMAP) _ClipBoard_Close() _WinAPI_DeleteObject($hBitmap2) Edited March 25, 2023 by Nine corrected a small bug KaFu, ioa747 and Zedna 2 1 “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Screen Scraping Multi-Threading Made Easy Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now