您现在的位置:首页 >> 硬件系统 >> 硬件系统 >> 内容

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

时间:2011-9-3 15:21:57 点击:

  核心提示:分别要用到API: DragAcceptFiles()函数,令窗体接受文件拖拽的消息 WM_DROPFILES消息文件拖拽时接收看来得向窗体发送WM_DROPFILES消息,发送消息是SendMess...
分别要用到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相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2017 版权所有 All Rights Reserved.
  • 沪ICP备05001939号