4

I am using a program called "screen shot assistant" to convert PNG files to JPG. The program outputs the files from the clipboard to a designated folder.

(using AHK or any other method) I am looking for a way to take the most recently added image in that folder and copy it onto the clipboard so that I can paste it elsewhere.

Thank you for your time!

  • Re: "copy it onto the clipboard"... this could mean a few different things. When you perform a "paste" action, are you hoping to move the file to a different folder? (i.e., copy/paste between folders in Explorer?) Are you hoping to paste the latest file path as text? Or are you hoping to insert graphics into a document such as Word or something similar? I believe the first two would be addressed by the code already posted below and there are other methods to address the third if the code below doesn't do that also, which it may--I didn't test it – JJohnston2 Jun 3 '17 at 5:38
1

Copy the newest JPG-file in Windows folder to clipboard automatically (as soon as created):

#Persistent
SetTimer new_JPG_image_created, 300
return

    new_JPG_image_created:
Loop,  folder_path\*.jpg
{
    now := %A_Now%
    EnvSub, now, %A_LoopFileTimeCreated%, seconds
    If now < 2 ; newer as 2 seconds
    { 
        SetTimer, new_JPG_image_created, off    
        ; MsgBox, 262212,,A new file `n%A_Tab%%A_LoopFileFullPath%`nis added in`n%A_Tab%folder_path`nCopy this file?
        ; IfMsgBox Yes
            ClipBoardSetFiles(A_LoopFileFullPath)
        SetTimer, new_JPG_image_created, on
    }
}
return

; -------------------------------------------------------------
; FUNCTION: 
; https://autohotkey.com/boards/viewtopic.php?p=63914#p63914
; -------------------------------------------------------------

ClipboardSetFiles(FilesToSet, DropEffect := "Copy") {
   ; FilesToSet - list of fully qualified file pathes separated by "`n" or "`r`n"
   ; DropEffect - preferred drop effect, either "Copy", "Move" or "" (empty string)
   Static TCS := A_IsUnicode ? 2 : 1 ; size of a TCHAR
   Static PreferredDropEffect := DllCall("RegisterClipboardFormat", "Str", "Preferred DropEffect")
   Static DropEffects := {1: 1, 2: 2, Copy: 1, Move: 2}
   ; -------------------------------------------------------------------------------------------------------------------
   ; Count files and total string length
   TotalLength := 0
   FileArray := []
   Loop, Parse, FilesToSet, `n, `r
   {
      If (Length := StrLen(A_LoopField))
         FileArray.Push({Path: A_LoopField, Len: Length + 1})
      TotalLength += Length
   }
   FileCount := FileArray.Length()
   If !(FileCount && TotalLength)
      Return False
   ; -------------------------------------------------------------------------------------------------------------------
   ; Add files to the clipboard
   If DllCall("OpenClipboard", "Ptr", A_ScriptHwnd) && DllCall("EmptyClipboard") {
      ; HDROP format ---------------------------------------------------------------------------------------------------
      ; 0x42 = GMEM_MOVEABLE (0x02) | GMEM_ZEROINIT (0x40)
      hDrop := DllCall("GlobalAlloc", "UInt", 0x42, "UInt", 20 + (TotalLength + FileCount + 1) * TCS, "UPtr")
      pDrop := DllCall("GlobalLock", "Ptr" , hDrop)
      Offset := 20
      NumPut(Offset, pDrop + 0, "UInt")         ; DROPFILES.pFiles = offset of file list
      NumPut(!!A_IsUnicode, pDrop + 16, "UInt") ; DROPFILES.fWide = 0 --> ANSI, fWide = 1 --> Unicode
      For Each, File In FileArray
         Offset += StrPut(File.Path, pDrop + Offset, File.Len) * TCS
      DllCall("GlobalUnlock", "Ptr", hDrop)
      DllCall("SetClipboardData","UInt", 0x0F, "UPtr", hDrop) ; 0x0F = CF_HDROP
      ; Preferred DropEffect format ------------------------------------------------------------------------------------
      If (DropEffect := DropEffects[DropEffect]) {
         ; Write Preferred DropEffect structure to clipboard to switch between copy/cut operations
         ; 0x42 = GMEM_MOVEABLE (0x02) | GMEM_ZEROINIT (0x40)
         hMem := DllCall("GlobalAlloc", "UInt", 0x42, "UInt", 4, "UPtr")
         pMem := DllCall("GlobalLock", "Ptr", hMem)
         NumPut(DropEffect, pMem + 0, "UChar")
         DllCall("GlobalUnlock", "Ptr", hMem)
         DllCall("SetClipboardData", "UInt", PreferredDropEffect, "Ptr", hMem)
      }
      DllCall("CloseClipboard")
      Return True
   }
   Return False
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.