автоматически скопировать новый файл из папки Windows в буфер обмена

367
John Smith

Я использую программу под названием « помощник по снимку экрана » для преобразования файлов PNG в JPG. Программа выводит файлы из буфера обмена в назначенную папку.

(используя AHK или любой другой метод) Я ищу способ взять последнее добавленное изображение в этой папке и скопировать его в буфер обмена, чтобы я мог вставить его в другое место.

Спасибо за ваше время!

5
Re: «скопировать его в буфер обмена» ... это может означать несколько разных вещей. Когда вы выполняете действие «вставить», надеетесь ли вы переместить файл в другую папку? (т.е. копировать / вставлять между папками в Проводнике?) Вы надеетесь вставить последний путь к файлу в виде текста? Или вы надеетесь вставить графику в документ, такой как Word или что-то подобное? Я полагаю, что первые два будут решены с помощью кода, уже опубликованного ниже, и есть другие методы для решения третьего, если приведенный ниже код также не делает этого, что может - я не проверял это JJohnston2 6 лет назад 0

1 ответ на вопрос

2
user3419297

Скопируйте самый новый JPG-файл из папки Windows в буфер обмена автоматически (после его создания):

#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 :=  ; ------------------------------------------------------------------------------------------------------------------- ; Count files and total string length TotalLength := 0 FileArray := [] Loop, Parse, FilesToSet, `n, `r { If (Length := StrLen(A_LoopField)) FileArray.Push() 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 } 

Похожие вопросы