[AHK]一键发送选中的文件给微信好友

105 篇文章 5 订阅

群友提问:
有办法用ahk直接发送小文件或软件给微信好友吗,最好是用热字符串的方式

以下脚本为书妖答复

 

 

我稍加整理,增加了多个文件的支持,脚本如下

微信可以这样尝试一下
1、在资源管理器中,选中要发送的文件,之后按 F8
2、脚本会自动定位到与xxx聊天  ,本脚本以文件传输助手来示范。
3、脚本会自动发送^v,将要发送的文件粘贴到聊天区。


/*
脚本说明:用ahk定义热键或热字串直接发送小文件或软件给微信好友
更新日期:2021年5月14日
最新版:https://blog.csdn.net/liuyukuan/article/details/116800433

微信可以这样尝试一下,
1、在资源管理器中,选中要发送的文件,之后按 F8
2、脚本会自动定位到与xxx聊天  ,本脚本以文件传输助手来示范。
3、脚本会自动发送^v,将要发送的文件粘贴到聊天区。
*/

F8::
OutputDebug, Because the window
PathToCopy:=Explorer_GetSelection()
OutputDebug %PathToCopy%
FileToClipboard(PathToCopy)
WinShow,微信 ahk_class WeChatMainWndForPC
WinActivate,微信 ahk_class WeChatMainWndForPC
Sleep,300
Send ^f
Sleep,200
Send {text} 文件传输助手
Sleep,500
OutputDebug, "找到"
Send {Shift}{Enter}
OutputDebug, "进入"
Sleep 1000
OutputDebug,  "粘贴"
Send ^v
return

Explorer_GetSelection(hwnd="")   
{  
    WinGet, process, processName, % "ahk_id" hwnd := hwnd? hwnd:WinExist("A")  
    WinGetClass class, ahk_id %hwnd%  
    if (process != "explorer.exe")  
        return  
    if (class ~= "Progman|WorkerW") {  
            ControlGet, files, List, Selected Col1, SysListView321, ahk_class %class%  
            Loop, Parse, files, `n, `r  
                ToReturn .= A_Desktop "\" A_LoopField "`n"  
        } else if (class ~= "(Cabinet|Explore)WClass") {  
            for window in ComObjCreate("Shell.Application").Windows 
			{
				try{
                if (window.hwnd==hwnd)  
                    sel := window.Document.SelectedItems  
				}catch e {
					continue
			}
			}
            for item in sel  
                ToReturn .= item.path "`n"  
        }  
    return Trim(ToReturn,"`n")  
} 
/*
	path_list =
	(
	d:\test.txt
	d:\test2.txt
	)

	FileToClipboard(path_list)
*/
;~ 当前内容如果是非文件,则清空并写入目标文件,如果是文件,则将目标文件加入剪贴板行列
;~ 就是将不同目录的文件添加到剪贴板,可以一并复制

FileToClipboard(PathToCopy, Method="copy")
{
	; 展开为完整路径
		Loop, Parse, PathToCopy, `n, `r
			PathToCopy_Full .= "`n" GetFullPath(A_LoopField)
		PathToCopy := Trim(PathToCopy_Full, "`n")

	FileCount:=0
	PathLength:=0

	; Count files and total string length
	Loop,Parse,PathToCopy,`n,`r
	{
		FileCount++
		PathLength += StrLen(A_LoopField)
	}

	pid:=DllCall("GetCurrentProcessId","uint")
	hwnd:=WinExist("ahk_pid " . pid)
	; 0x42 = GMEM_MOVEABLE(0x2) | GMEM_ZEROINIT(0x40)
	hPath := DllCall("GlobalAlloc","uint",0x42,"uint",20 + (PathLength + FileCount + 1) * 2,"UPtr")
	pPath := DllCall("GlobalLock","UPtr",hPath)
	NumPut(20,pPath+0),pPath += 16 ; DROPFILES.pFiles = offset of file list
	NumPut(1,pPath+0),pPath += 4 ; fWide = 0 -->ANSI,fWide = 1 -->Unicode
	Offset:=0
	Loop,Parse,PathToCopy,`n,`r ; Rows are delimited by linefeeds (`r`n).
		offset += StrPut(A_LoopField,pPath+offset,StrLen(A_LoopField)+1,"UTF-16") * 2

	DllCall("GlobalUnlock","UPtr",hPath)
	DllCall("OpenClipboard","UPtr",hwnd)
	DllCall("EmptyClipboard")
	DllCall("SetClipboardData","uint",0xF,"UPtr",hPath) ; 0xF = CF_HDROP

	; Write Preferred DropEffect structure to clipboard to switch between copy/cut operations
	; 0x42 = GMEM_MOVEABLE(0x2) | GMEM_ZEROINIT(0x40)
	mem := DllCall("GlobalAlloc","uint",0x42,"uint",4,"UPtr")
	str := DllCall("GlobalLock","UPtr",mem)

	if (Method="copy")
		DllCall("RtlFillMemory","UPtr",str,"uint",1,"UChar",0x05)
	else if (Method="cut")
		DllCall("RtlFillMemory","UPtr",str,"uint",1,"UChar",0x02)
	else
	{
		DllCall("CloseClipboard")
		return
	}

	DllCall("GlobalUnlock","UPtr",mem)

	cfFormat := DllCall("RegisterClipboardFormat","Str","Preferred DropEffect")
	DllCall("SetClipboardData","uint",cfFormat,"UPtr",mem)
	DllCall("CloseClipboard")
	return
}

GetFullPath(fpath)
{
	Loop, %fpath%
		Return, A_LoopFileLongPath
}

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 你可以在 Autohotkey 脚本内使用 Reload 函数来重新加载它自己。该函数的语法如下: Reload 使用该函数的示例如下: ^r:: Reload return 上面的示例中,当用户按下 "Ctrl + R" 组合键时,脚本将会重新加载自身。 ### 回答2: AutoHotkey(简称AHK)是一种自动化脚本语言,常用于自动化操作、自定义快捷键等。如果你想要让一个AHK文件在运行时重新加载自己,可以使用以下方法。 首先,在你的AHK脚本中添加一个快捷键绑定,用于触发重新加载。你可以选择任意一个你喜欢的快捷键,比如"Ctrl + Alt + R"。添加以下代码可以实现这个功能: ^!r:: Reload return 第一行代码中的"^"代表Control键,"!"代表Alt键,"r"代表"R"键。所以 "^!r"即为"Ctrl + Alt + R"。第三行的"Reload"命令用于重新加载脚本。 将以上代码添加至你的AHK脚本中,保存修改。 接下来,在你打开的AHK脚本中,按下设置的快捷键"Ctrl + Alt + R"即可重新加载脚本。这样,你就不需要关闭脚本再重新打开它了,可以直接加载修改后的内容。 需要注意的是,重新加载脚本会终止当前脚本的执行,并重新启动脚本。 希望以上解答对你有所帮助。如有其他问题,请随时提问。 ### 回答3: 要让AutoHotkey(AHK文件重新加载自己,你可以使用AHK内置的Reload函数。Reload函数可以重启当前运行的脚本,即重新加载脚本文件。 你可以在脚本文件的任何位置使用Reload函数来实现重新加载。以下是一个示例: ```autohotkey ^!r:: Reload return ``` 上述代码将Ctrl+Alt+R绑定到Reload函数。当你按下这个组合键时,AHK脚本会重新加载。 如果你想要自动重载脚本,你可以将Reload函数与文件监视器结合使用。文件监视器可以监视脚本文件的任何更改,并在更改后自动重新加载。 以下是一个将文件监视器与Reload函数结合使用的示例: ```autohotkey #Persistent SetTimer, ReloadCheck, 1000 return ReloadCheck: If (FileExist("脚本文件的完整路径")) { FileGetTime, currentModified, 脚本文件的完整路径 If (currentModified != previousModified) { Reload } } previousModified := currentModified return ``` 在上述代码中,我们首先设置了一个持续的定时器(SetTimer),它每秒钟检查一次脚本文件是否有更改。然后,我们使用FileExist和FileGetTime函数来获取脚本文件的最新修改时间,如果最新修改时间与之前保存的修改时间不同,则重新加载脚本。 请注意,你需要将代码中的"脚本文件的完整路径"替换为你实际的脚本文件路径。 这些是使用AutoHotkey重新加载脚本的两种方法。希望对你有帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值