`
huobengle
  • 浏览: 863312 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
如何模拟文件拖拽,这个问题得反过来分析:“如何接受文件拖拽”?
分别要用到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;
分享到:
评论

相关推荐

    delphi 开发经验技巧宝典源码

    0011 如何锁定窗体中的组件 9 0012 如何改变窗体上的网格大小 10 0013 组件的选取 10 0014 改变窗体Hint背景色 11 0015 以原始风格显示控件的滚动条 11 0016 使用快捷键打开对象观察器中的“...”按钮 ...

    delphi 开发经验技巧宝典源码06

    0011 如何锁定窗体中的组件 9 0012 如何改变窗体上的网格大小 10 0013 组件的选取 10 0014 改变窗体Hint背景色 11 0015 以原始风格显示控件的滚动条 11 0016 使用快捷键打开对象观察器中的“...”按钮 ...

    《Visual C# .NET精彩编程实例集锦》配套光盘文件【全】

    实例41 如何拖动无标题栏窗体 实例42 如何制作自绘式菜单 实例43 如何制作图形组合框 实例44 如何设置窗体的透明度 实例45 如何设置窗体启动位置 实例46 如何设置窗体最前端显示 实例47 如何实现精灵提示 ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例077 把异常与错误信息显示到窗体中 97 实例078 从字符串中分离文件路径、 文件名及扩展名 98 实例079 判断手机号的合法性 99 实例080 用字符串构建器追加字符 100 实例081 去掉字符串中的所有空格 101 实例082 ...

    Visual C++编程技巧精选集 光盘

    79.如何使窗体中的控件跟随鼠标移动而移动 80.如何设置静态文本控件的背景和文本颜色 81.如何通过控件实现鼠标拖动文本效果 第3章 标题栏和菜单栏 82.如何获取程序窗口标题栏的高度 83.如何获取程序窗口标题栏的...

    java源码包2

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java源码包---java 源码 大量 实例

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    Delphi开发范例宝典目录

    实例054 如何关闭MDI类型窗体中的子窗体 63 实例055 向提示框中添加图标 64 第2章 控件应用 67 2.1 TEdit控件应用典型实例 68 实例056 从右至左输入数据 68 实例057 为TEdit控件添加列表选择框 69 实例...

Global site tag (gtag.js) - Google Analytics