Shell extension 如何取得拖進檔案總管資料夾的事件 |
缺席
|
blue
中階會員 ![]() ![]() ![]() 發表:170 回覆:136 積分:81 註冊:2002-04-15 發送簡訊給我 |
|
pedro
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
Hi
Maybe this page is useful for you to pursue, sorry for no time to check it work or not. http://www.360doc.com/content/12/0302/12/219800_191068903.shtml ===================引 用 blue 文 章=================== Hi,各位先進大家好: 小弟實作 IDropTarget 可以取得將檔案拖到檔案總管內某一特定類型檔案的事件, 可是,該如何實作可以得到將檔案拖到檔案總管內資料夾的事件? 謝謝!
編輯記錄
pedro 重新編輯於 2012-05-18 03:21:48, 註解 無‧
|
blue
中階會員 ![]() ![]() ![]() 發表:170 回覆:136 積分:81 註冊:2002-04-15 發送簡訊給我 |
Hi,
感謝 Pedro 先進指導, 不過,小弟需要的是在檔案總管的地方能夠處理的程序, 謝謝! ===================引 用 pedro 文 章=================== Hi Maybe this page is useful for you to pursue, sorry for no time to check itwork or not. http://www.360doc.com/content/12/0302/12/219800_191068903.shtml ===================引 用 blue 文 章=================== Hi,各位先進大家好: 小弟實作 IDropTarget 可以取得將檔案拖到檔案總管內某一特定類型檔案的事件, 可是,該如何實作可以得到將檔案拖到檔案總管內資料夾的事件? 謝謝! |
leveon
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
|
blue
中階會員 ![]() ![]() ![]() 發表:170 回覆:136 積分:81 註冊:2002-04-15 發送簡訊給我 |
Hi,感謝Leveon先進的指導,
小弟是寫成 COM.DLL 拜了多少Google大神的分身, 但,所找到的都是針對DropTarget是檔案的處理, 對於DropTarget是資料夾的部份一直找不到, 小弟的Code如下,謝謝! unit DropHelper; interface uses Windows, ActiveX, ComObj, ShlObj, Dialogs; const Class_DropHandler: TGUID = '{574AF620-AC3D-11D4-86B6-92AD195EF923}'; type TDropHandler = class(TComObject, IShellExtInit, IUnknown, IPersistFile, IDropTarget) private FFileName: array[0..MAX_PATH] of Char; Nfiles: integer; FFiles: array[0..max_PATH] of PChar; DestFile: string; protected { IShellExtInit } function IShellExtInit.Initialize = SEIInitialize; // Avoid compiler warning function SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject; hKeyProgID: HKEY): HResult; stdcall; { IPersistFile } function IsDirty: HResult; stdcall; function Load(pszFileName: POleStr; dwMode: Longint): HResult; stdcall; function Save(pszFileName: POleStr; fRemember: BOOL): HResult; stdcall; function SaveCompleted(pszFileName: POleStr): HResult; stdcall; function GetCurFile(out pszFileName: POleStr): HResult; stdcall; function GetClassID(out classID: TCLSID): HResult; stdcall; { IDropTarget } function DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall; function DragOver(grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall; function DragLeave: HResult; stdcall; function Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall; end; implementation uses ComServ, SysUtils, ShellApi, Registry; ////////////////////////////////// TDropHandler /////////////////////////////////// function TDropHandler.SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject; hKeyProgID: HKEY): HResult; var StgMedium: TStgMedium; FormatEtc: TFormatEtc; begin if (lpdobj = nil) then begin Result := E_INVALIDARG; Exit; end; with FormatEtc do begin cfFormat := CF_HDROP; ptd := nil; dwAspect := DVASPECT_CONTENT; lindex := -1; tymed := TYMED_HGLOBAL; end; // Render the data referenced by the IDataObject pointer to an HGLOBAL // storage medium in CF_HDROP format. Result := lpdobj.GetData(FormatEtc, StgMedium); if Failed(Result) then Exit; Result := NOERROR; ReleaseStgMedium(StgMedium); end; function TDropHandler.IsDirty: HResult; begin Result := E_NOTIMPL; end; function TDropHandler.Load(pszFileName: POleStr; dwMode: Integer): HResult; begin // 獲得被拖放的文件的完全路徑名,並將其保存在變數中 ShowMessage('Load'); DestFile := WideCharToString(pszFileName); Result := S_OK; end; function TDropHandler.Save(pszFileName: POleStr; fRemember: BOOL): HResult; begin Result := E_NOTIMPL; end; function TDropHandler.SaveCompleted(pszFileName: POleStr): HResult; begin Result := E_NOTIMPL; end; function TDropHandler.DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall; var StgMedium: TStgMedium; FormatEtc: TFormatEtc; hr: HRESULT; begin with FormatEtc do begin cfFormat := CF_HDROP; ptd := nil; dwAspect := DVASPECT_CONTENT; lindex := -1; tymed := TYMED_HGLOBAL; end; hr := dataobj.QueryGetData(formatetc); if Failed(hr) then begin // 如果無法獲得資料,就返回一個無效的拖放效果 dwEffect:=DROPEFFECT_NONE; Result := E_FAIL; Exit; end else begin // 如果一切OK,就需要返回一個複製操作效果 dwEffect:=DROPEFFECT_COPY; Result := NOERROR; end; end; function TDropHandler.DragOver(grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall; begin dwEffect:=DROPEFFECT_COPY; Result := S_OK; end; function TDropHandler.DragLeave: HResult; stdcall; begin Result := S_OK; end; function TDropHandler.Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall; var StgMedium: TStgMedium; FormatEtc: TFormatEtc; hr: HRESULT; F: TextFile; i: Integer; begin // 這是整個單元中最重要的部分,檔被釋放到拖放目標上 // 在這裡我們的擴展將把所有被拖放的檔案名寫到一個文字檔中 ShowMessage('Drop'); if (dataobj = nil) then begin Result := E_INVALIDARG; Exit; end; with FormatEtc do begin cfFormat := CF_HDROP; ptd := nil; dwAspect := DVASPECT_CONTENT; lindex := -1; tymed := TYMED_HGLOBAL; end; //利用IDataObject獲得資料 hr := dataobj.GetData(FormatEtc, StgMedium); if Failed(hr) then Exit; // 將所有被拖放的檔寫到指定檔中 NFiles:=DragQueryFile(StgMedium.hGlobal, $FFFFFFFF, nil, 0); // 有多少檔被拖放? AssignFile(F,'C:\Temp\DroppedFiles.txt'); Rewrite(f); for i:=0 to nfiles-1 do begin // 讀取拖放檔清單,並將檔案名記錄下來 DragQueryFile(StgMedium.hGlobal, i, FFileName , SizeOf(FFilename)); writeln(F, FFilename); // 如果拖放物件是一個目錄,就記錄目錄名 if GetFileAttributes(FFilename)=faDirectory then writeln (f,'Folder -> ' ffilename); end; //記錄下拖放的目的檔案名 writeln(f,'Drop Target -> ' DestFile); CloseFile(f); Result := NOERROR; ReleaseStgMedium(StgMedium); end; function TDropHandler.GetClassID(out classID: TCLSID): HResult; begin Result := E_NOTIMPL; end; function TDropHandler.GetCurFile(out pszFileName: POleStr): HResult; begin Result := E_NOTIMPL; end; /////////////////////////////// TDropHandlerFactory /////////////////////////////// type TDropHandlerFactory = class(TComObjectFactory) public procedure UpdateRegistry(Register: Boolean); override; end; procedure TDropHandlerFactory.UpdateRegistry(Register: Boolean); var ClassID: string; begin if Register then begin inherited UpdateRegistry(Register); ClassID := GUIDToString(Class_DropHandler); // 這裡我們設定.Dpr檔為我們要處理的檔類 CreateRegKey('Directory\shellex', '', ''); CreateRegKey('Directory\shellex\DragDropHandlers\MyCopyHelpers', '', ClassID); CreateRegKey('Folder\shellex', '', ''); CreateRegKey('Folder\shellex\DragDropHandlers\MyCopyHelpers', '', ClassID); if (Win32Platform = VER_PLATFORM_WIN32_NT) then with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions', True); OpenKey('Approved', True); WriteString(ClassID, 'My Shell Helpers Extension'); finally Free; end; end else begin DeleteRegKey('Directory\shellex\DropHandlers\MyCopyHelpers'); DeleteRegKey('Directory\shellex'); DeleteRegKey('Folder\shellex\DropHandlers\MyCopyHelpers'); DeleteRegKey('Folder\shellex'); inherited UpdateRegistry(Register); end; end; initialization TDropHandlerFactory.Create(ComServer, TDropHandler, Class_DropHandler, '', 'My Shell Extension', ciMultiInstance, tmApartment); end. ===================引 用 leveon 文 章=================== 估計你這樣問只能得到簡單的回應 來些Code 顯現你研究的進度 表現一下求教的誠意 才能得到更完整的回答 要達到這個效果 1.程式要編寫成COM DLL 2.Creating Drop Handlers google一下吧 MSDN上有 |
leveon
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
|
james2mac
一般會員 ![]() ![]() 發表:11 回覆:11 積分:4 註冊:2008-02-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |