我正在使用一个名为“屏幕截图助手“将 PNG 文件转换为 JPG。该程序将文件从剪贴板输出到指定的文件夹。
(使用 AHK 或任何其他方法)我正在寻找一种方法来获取该文件夹中最近添加的图像并将其复制到剪贴板上,以便我可以将其粘贴到其他地方。
感谢您的时间!
答案1
将 Windows 文件夹中的最新 JPG 文件复制到剪贴板自动地(一旦创建):
#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
}