線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2179
推到 Plurk!
推到 Facebook!

Shell extension 如何取得拖進檔案總管資料夾的事件

缺席
blue
中階會員


發表:115
回覆:106
積分:59
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-05-18 11:35:29 IP:122.146.xxx.xxx 訂閱
Hi,各位先進大家好:
小弟實作 IDropTarget 可以取得將檔案拖到檔案總管內某一特定類型檔案的事件,
可是,該如何實作可以得到將檔案拖到檔案總管內資料夾的事件?
謝謝!
pedro
尊榮會員


發表:152
回覆:1177
積分:865
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-05-18 17:17:17 IP:60.248.xxx.xxx 未訂閱
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
中階會員


發表:115
回覆:106
積分:59
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-05-21 13:42:45 IP:122.146.xxx.xxx 訂閱
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
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-06-07 11:57:46 IP:118.165.xxx.xxx 訂閱
 估計你這樣問只能得到簡單的回應 
來些Code 顯現你研究的進度 表現一下求教的誠意
才能得到更完整的回答

要達到這個效果
1.程式要編寫成COM DLL
2.Creating Drop Handlers

google一下吧 MSDN上有
blue
中階會員


發表:115
回覆:106
積分:59
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-06-07 15:42:25 IP:122.146.xxx.xxx 訂閱
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
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-06-08 10:43:15 IP:118.165.xxx.xxx 訂閱
 Code大概看過一次  問題點大概是機碼錯誤
我沒有現成的機碼可以幫你

我以前找機碼的經驗 觀察市面上現有軟體註冊的機碼
找相似的功能 如winrar 之類的
然後自行寫入機碼


james2mac
一般會員


發表:11
回覆:11
積分:4
註冊:2008-02-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-07-18 11:26:38 IP:60.249.xxx.xxx 訂閱

試試這個 {D17ED7D6-0904-4BD6-B4B2-70D768B9A8F9}

===================引 用 blue 文 章===================

Class_DropHandler: TGUID = '{574AF620-AC3D-11D4-86B6-92AD195EF923}';

系統時間:2017-12-13 9:34:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!