请问有没有后台模拟文件拖拽的函数,或者实现方法
本帖最后由 LiYi1987 于 2013-11-7 00:54 编辑比如,正在运行的某程序窗口界面可以接受拖入文件,那么我希望能模拟一个这个拖拽的过程,但是并不想使用MouseDown()、MouseMove()、MouseUp()、MouseClickDrag()等函数,我想使用WinAPI或者是Au3的函数来从后台实现它,也就是向这个窗口发送该文件,而不是让用户眼睁睁地看到这样一个用鼠标拖拽的过程。
请问有这样的WinAPI或者Au3的函数吗? 本帖最后由 komaau3 于 2013-11-8 13:28 编辑
回复 1# LiYi1987
查了下资料,翻译成AU3,测试可以实现模拟拖拽(代码示例把“CDkey.txt拖到记事本窗口”)
原文:http://huidaqq.blog.163.com/blog/static/35643562200981893849626/#include <WindowsConstants.au3>
#Include <WinAPI.au3>
#Include <Memory.au3>
#include <SendMessage.au3>
Local $hWnd = WinGetHandle("新建 文本文档.txt - 记事本")
Local $Bool = DropFile($hWnd ,@ScriptDir & "\CDKey.txt")
MsgBox(0, 0, $Bool)
Func DropFile($hWnd ,$sFile)
;typedef struct _DROPFILES {
; DWORD pFiles;
; POINT pt;
; BOOLfNC;
; BOOLfWide;
;} DROPFILES, *LPDROPFILES;
If Not FileExists($sFile) Or Not IsHWnd($hWnd) Then Return False
Local $iProcess = WinGetProcess($hWnd)
Local $hProcess = _WinAPI_OpenProcess(BitOR($PROCESS_VM_OPERATION, $PROCESS_VM_READ, $PROCESS_VM_WRITE), False, $iProcess)
Local $vPointer = _MemVirtualAllocEx($hProcess, Null, 4096, BitOR($MEM_RESERVE, $MEM_COMMIT), $PAGE_READWRITE)
Local $tagDROPFILES = "dword pFiles;" & $tagPOINT & ";bool fNC;bool fWide"
Local $tagWRITEDATA = $tagDROPFILES & ";wchar[" & StringLen($sFile) + 1 & "]"
Local $tDropFiles = DllStructCreate($tagDROPFILES)
Local $tWriteData = DllStructCreate($tagWRITEDATA);一次写入
DllStructSetData($tWriteData, "pFiles", DllStructGetSize($tDropFiles))
DllStructSetData($tWriteData, "X", 0)
DllStructSetData($tWriteData, "Y", 0)
DllStructSetData($tWriteData, "fNC", 0)
DllStructSetData($tWriteData, "fWide", 1)
DllStructSetData($tWriteData, 6, $sFile)
Local $iWritten
_WinAPI_WriteProcessMemory($hProcess, $vPointer, DllStructGetPtr($tWriteData), DllStructGetSize($tWriteData), $iWritten)
_SendMessage($hWnd, $WM_DROPFILES, $vPointer, 0)
_MemVirtualFreeEx($hProcess, $vPointer, 0, $MEM_RELEASE);
_WinAPI_CloseHandle($hProcess)
Return True
EndFunc
回复 2# komaau3
辛苦了,我百度了好久都找不到资料,刚才测试了一下这个函数确实不错,在大多数情况下都实现了功能。不过,我发现,如果接受文件的窗口是一个浏览器(测试了IE和Chrome),运行这个函数会返回true,但是并没有正常打开文件。我再好好学习一下这个函数的实现过程。非常感谢 回复 3# LiYi1987
上面的函数原理是SendMessage发送WM_DROPFILES消息,spy++抓下浏览器的拖拽是什么消息,响应消息的是父窗口还是子窗口?分析下看看 学习了,谢谢分享!
页:
[1]