找回密码
 加入
搜索
查看: 4092|回复: 4

[系统综合] 请问有没有后台模拟文件拖拽的函数,或者实现方法

[复制链接]
发表于 2013-11-7 00:42:24 | 显示全部楼层 |阅读模式
本帖最后由 LiYi1987 于 2013-11-7 00:54 编辑

比如,正在运行的某程序窗口界面可以接受拖入文件,那么我希望能模拟一个这个拖拽的过程,但是并不想使用MouseDown()、MouseMove()、MouseUp()、MouseClickDrag()等函数,我想使用WinAPI或者是Au3的函数来从后台实现它,也就是向这个窗口发送该文件,而不是让用户眼睁睁地看到这样一个用鼠标拖拽的过程。
请问有这样的WinAPI或者Au3的函数吗?
发表于 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;
        ;        BOOL  fNC;
        ;        BOOL  fWide;
        ;} 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金钱 +75 贡献 +30 收起 理由
pusofalse + 30 + 5 学习了~
LiYi1987 + 45 + 25 谢谢帮忙

查看全部评分

 楼主| 发表于 2013-11-8 10:29:49 | 显示全部楼层
回复 2# komaau3


    辛苦了,我百度了好久都找不到资料,刚才测试了一下这个函数确实不错,在大多数情况下都实现了功能。不过,我发现,如果接受文件的窗口是一个浏览器(测试了IE和Chrome),运行这个函数会返回true,但是并没有正常打开文件。我再好好学习一下这个函数的实现过程。非常感谢
发表于 2013-11-8 13:24:00 | 显示全部楼层
回复 3# LiYi1987

上面的函数原理是SendMessage发送WM_DROPFILES消息,spy++抓下浏览器的拖拽是什么消息,响应消息的是父窗口还是子窗口?分析下看看
发表于 2013-11-8 13:57:07 | 显示全部楼层
学习了,谢谢分享!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-4 08:58 , Processed in 0.076237 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表