如何模拟文件拖拽,这个问题得反过来分析:“如何接受文件拖拽”?
分别要用到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;
分享到:
相关推荐
0011 如何锁定窗体中的组件 9 0012 如何改变窗体上的网格大小 10 0013 组件的选取 10 0014 改变窗体Hint背景色 11 0015 以原始风格显示控件的滚动条 11 0016 使用快捷键打开对象观察器中的“...”按钮 ...
0011 如何锁定窗体中的组件 9 0012 如何改变窗体上的网格大小 10 0013 组件的选取 10 0014 改变窗体Hint背景色 11 0015 以原始风格显示控件的滚动条 11 0016 使用快捷键打开对象观察器中的“...”按钮 ...
实例41 如何拖动无标题栏窗体 实例42 如何制作自绘式菜单 实例43 如何制作图形组合框 实例44 如何设置窗体的透明度 实例45 如何设置窗体启动位置 实例46 如何设置窗体最前端显示 实例47 如何实现精灵提示 ...
实例077 把异常与错误信息显示到窗体中 97 实例078 从字符串中分离文件路径、 文件名及扩展名 98 实例079 判断手机号的合法性 99 实例080 用字符串构建器追加字符 100 实例081 去掉字符串中的所有空格 101 实例082 ...
79.如何使窗体中的控件跟随鼠标移动而移动 80.如何设置静态文本控件的背景和文本颜色 81.如何通过控件实现鼠标拖动文本效果 第3章 标题栏和菜单栏 82.如何获取程序窗口标题栏的高度 83.如何获取程序窗口标题栏的...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
实例054 如何关闭MDI类型窗体中的子窗体 63 实例055 向提示框中添加图标 64 第2章 控件应用 67 2.1 TEdit控件应用典型实例 68 实例056 从右至左输入数据 68 实例057 为TEdit控件添加列表选择框 69 实例...