模拟文件拖拽到指定窗体中

如何模拟文件拖拽,这个问题得反过来分析:“如何接受文件拖拽”?
分别要用到API:
DragAcceptFiles()函数,令窗体接受文件拖拽的消息
WM_DROPFILES消息文件拖拽时接收

看来得向窗体发送
WM_DROPFILES消息,发送消息是SendMessage()函数
为节约时间我们要站在巨人的肩膀--搜索
关键词就基本确定为:“WM_DROPFILES SendMessage 模拟文件拖拽
此处省略1000字

uses
ShlObj;

function ExecDropFile( // 模拟文件拖拽
AHandle: THandle;
// 目标窗体句柄
AFileName: string
// 文件名
): Boolean;
// 返回执行是否成功
var
vDropFiles: TDropFiles;
vProcessId: DWORD;
vProcess: THandle;
vPointer: PChar;
vNumberOfBytesRead: Cardinal;
begin
Result :
= False;
if not FileExists(AFileName) or not IsWindow(AHandle) then Exit;
GetWindowThreadProcessId(AHandle, @vProcessId);
vProcess :
= OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
PROCESS_VM_WRITE, False, vProcessId);
try
vPointer :
= VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
PAGE_READWRITE);
try
FillChar(vDropFiles, SizeOf(vDropFiles),
0);
vDropFiles.pFiles :
= SizeOf(TDropFiles);
WriteProcessMemory(vProcess, vPointer,
@vDropFiles, SizeOf(vDropFiles), vNumberOfBytesRead);
WriteProcessMemory(vProcess, vPointer
+ SizeOf(vDropFiles),
PChar(AFileName), Length(AFileName)
+ 1, vNumberOfBytesRead);
SendMessage(AHandle, WM_DROPFILES, Integer(vPointer),
0);
finally
VirtualFreeEx(vProcess, vPointer,
0, MEM_RELEASE);
end;
finally
CloseHandle(vProcess);
end;
Result :
= True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ExecDropFile(FindWindow(
'Notepad', nil), 'c:/temp/temp.txt');
end;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值