aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJohn Ankarström <john@ankarstrom.se>2021-01-30 23:37:46 +0100
committerJohn Ankarström <john@ankarstrom.se>2021-01-30 23:37:46 +0100
commit824c33100c383cc9a1405260bc86f193b1b26e68 (patch)
treef61e868fc9ff3460dd0b6e54b6869642ec8fc547 /lib
parentde6d6665f3e91245f0e6ea71bd00bcfdeb8176cb (diff)
downloadahk-824c33100c383cc9a1405260bc86f193b1b26e68.tar.gz
Add hotkey to print screen to file in clipboard
Diffstat (limited to 'lib')
-rw-r--r--lib/Misc.ahk49
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/Misc.ahk b/lib/Misc.ahk
new file mode 100644
index 0000000..3ebaca7
--- /dev/null
+++ b/lib/Misc.ahk
@@ -0,0 +1,49 @@
+; by "just me" at AutoHotkey forums
+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
+}