如何把 ListView 的项目拉到资源管理器

最近看到好像很多人不会,我就写一个吧。 SHELL 的方法就不说了,说个简单的。

1 首先把 ListView 的 DrawMode 设置为 dmAutomatic,
2 然后在 FormOnCreate 事件写上   DragAcceptFiles(ListView.Handle, True);
3 文件拖出 ListView 然后放手的事件是 OnEndDrag, 这个时间可以得当前鼠标的 X,Y.
4 然后看代码
最近看到好像很多人不会,我就写一个吧。
1 首先把 ListView 的 DrawMode 设置为 dmAutomatic,
2 然后在 FormOnCreate 事件写上   DragAcceptFiles(ListView.Handle, True);
3 文件拖出 ListView 然后放手的事件是 OnEndDrag, 这个时间可以得当前鼠标的 X,Y.
4 然后看代码
procedure TExplorerForm.ListViewEndDrag(Sender, Target: TObject; X, Y: Integer);
var
  Point: TPoint;
  Hwnd, Hwnd2: THandle;
  Text: array[0..MAX_PATH - 1] of Char;
  Size: Integer;
  TmpFn, NewName: string;
  Node: TTreeNode;
begin
  Point.X:= X;
  Point.Y:= Y;
  Hwnd:= WindowFromPoint(Point);
  //取得主 hwnd
  repeat
    Hwnd2:= GetParent(Hwnd);
    if Hwnd2 <> 0 then
      Hwnd:= Hwnd2;
  until Hwnd2 = 0;
  Size:= GetClassName(Hwnd, @Text[0], MAX_PATH);
  //比较是否资源管理器
  if StrLComp(@Text[0], 'ExploreWClass', Size) = 0 then
    begin
      GetTempPath(MAX_PATH, @Text[0]);
      //设法把你要的文件写到临时目录
      TmpFn:= Text + ListView.Selected.Caption;
      //剪切
      if not CopyFilesToClipboard(TmpFn, True) then
        raise Exception.Create('Clipboard error!');
     //把资源管理器弄上来
      SetActiveWindow(Hwnd);
      SetForegroundWindow(Hwnd);
     //模拟粘贴
      keybd_event(VK_CONTROL, 0, 0 ,0);
      keybd_event(BYTE('V'), 0, 0 ,0);
      Sleep(50);
      keybd_event(BYTE('V'), 0, KEYEVENTF_KEYUP ,0);
      keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP,0);
      Sleep(50);
      //清空剪贴板
      OpenClipboard(0);
      EmptyClipboard;
      CloseClipboard;
end;
Tags:
相关文章:
引用通告地址: http://www.ff18.com/blog/cmd.asp?act=gettburl&id=18
评论: 2 | 引用: 0 | 浏览:
存在逆天 [2007-12-12 16:06:01] [回复该留言]
纯技术帖……路过……
moneygo [2007-12-13 15:17:43] [回复该留言]
路过,,,,看来又是一个高手呵....游戏学院
名称(*):
邮箱:
网站链接:
验证(*):
正文(*):
选 项:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。