copiar o arquivo mais novo na pasta do Windows para a área de transferência automaticamente

5

Estou usando um programa chamado " assistente de captura de tela " para converter arquivos PNG em JPG. O programa envia os arquivos da área de transferência para uma pasta designada.

(usando o AHK ou qualquer outro método) Estou procurando uma maneira de pegar a imagem adicionada mais recentemente nessa pasta e copiá-la na área de transferência para que eu possa colá-la em outro lugar.

Obrigado pelo seu tempo!

    
por John Smith 01.06.2017 / 15:18

1 resposta

2

Copie o arquivo JPG mais recente na pasta do Windows para a área de transferência automaticamente (assim que for criado):

#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
}
    
por 01.06.2017 / 23:19