LiYi1987 发表于 2013-11-7 00:42:24

请问有没有后台模拟文件拖拽的函数,或者实现方法

本帖最后由 LiYi1987 于 2013-11-7 00:54 编辑

比如,正在运行的某程序窗口界面可以接受拖入文件,那么我希望能模拟一个这个拖拽的过程,但是并不想使用MouseDown()、MouseMove()、MouseUp()、MouseClickDrag()等函数,我想使用WinAPI或者是Au3的函数来从后台实现它,也就是向这个窗口发送该文件,而不是让用户眼睁睁地看到这样一个用鼠标拖拽的过程。
请问有这样的WinAPI或者Au3的函数吗?

komaau3 发表于 2013-11-7 15:21:40

本帖最后由 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

LiYi1987 发表于 2013-11-8 10:29:49

回复 2# komaau3


    辛苦了,我百度了好久都找不到资料,刚才测试了一下这个函数确实不错,在大多数情况下都实现了功能。不过,我发现,如果接受文件的窗口是一个浏览器(测试了IE和Chrome),运行这个函数会返回true,但是并没有正常打开文件。我再好好学习一下这个函数的实现过程。非常感谢

komaau3 发表于 2013-11-8 13:24:00

回复 3# LiYi1987

上面的函数原理是SendMessage发送WM_DROPFILES消息,spy++抓下浏览器的拖拽是什么消息,响应消息的是父窗口还是子窗口?分析下看看

MaGiCmAn 发表于 2013-11-8 13:57:07

学习了,谢谢分享!
页: [1]
查看完整版本: 请问有没有后台模拟文件拖拽的函数,或者实现方法