在Delphi中操作快捷方式 (轉)

worldblog發表於2007-12-02
在Delphi中操作快捷方式 (轉)[@more@]

  在中操作快捷方式

  快捷方式減少了的重複,是啟動或開啟檔案或資料夾的方法,快捷方式對經常使用的程式、檔案和資料夾非常有用。在系統中,充斥著大量的快捷方式,那麼如何操作這些快捷方式就是一個很頭疼的問題,在Windows的中,無疑會經常碰到操作快捷方式檔案的問題,例如為程式建立快捷方式,修改程式的快捷方式等等。為了操作快捷方式,本人封裝了兩個,而且給出了一個詳細的例子。

 :namespace prefix = o ns = "urn:schemas--com::office" />

1.  快捷方式檔案的基本資訊

  快捷方式包含的資訊有:目標檔名、程式執行時的引數、、執行視窗的狀態、描述、工作目錄(起始位置)、圖示檔名和圖示等等。我們在操作快捷方式時,就要考慮到這些資訊。

2.  資料結構

  為了方便快捷地進行操作,有必要定義一個資料結構,以便在函式時傳遞必要的資訊:

const

CCH_MAXNAME=255;  //描述的緩衝區的大小

LNK_RUN_MIN=7;  //執行時最小化

LNK_RUN_MAX=3;  //執行是最大化

LNK_RUN_NORMAL=1;   //正常視窗

type LINK_FILE_INFO=record

  FileName:array[0..MAX_PATH] of char;  //目標檔名

  WorkDirectory:array[0..MAX_PATH] of char;  //工作目錄或者起始目錄

  IconLocation:array[0..MAX_PATH] of char;  //圖示檔名

   IconIndex:integer;  //圖示索引

  Arguments:array[0..MAX_PATH] of char;  //程式執行的引數

  Description:array[0..CCH_MAXNAME] of char;  //快捷方式的描述

  ItemIDList:PItemIDList;  //只供讀取使用

  RelativePath:array[0..255] of char;  //相對目錄,只能設定

  ShowState:integer;  //執行時的視窗狀態

  HotKey:;  //快捷鍵

  end;

3.  函式

  1)取得快捷方式或者修改資訊函式LinkFileInfo

要注意的是,需要在Uses部分新增comobj,,shlobj這三個單元,但是在本文例子中因為要轉化熱鍵為文字和使用Windows的 Execute,所以還要新增Menus 和ShellApi單元。同時對異常處理不夠完美,在使用時大家可以根據實際情況進行修改。

說明:函式有三個引數,其中第一個引數為要進行處理的快捷方式的檔名,第二個為LINK_FILE_INFO的結構,用於接收資訊或者輸入資訊對快捷方式進行修改,第三個參數列明是讀取快捷方式的資訊還是設定快捷方式的資訊。函式成功時返回true,否則為false。

原型:

function LinkFileInfo(const lnkFileName:string;var info:LINK_FILE_INFO;const bSet:boolean):boolean;

var

 hr:hresult;

 psl:IShelllink;

 wfd:_find_data;

 ppf:IPersistFile;

 lpw:pwchar;

 buf:pwidechar;

begin

 result:=false;

 getmem(buf,MAX_PATH);

 try

 if SUCCEEDED(CoInitialize(nil)) then

 if (succeeded(cocreateinstance(clsid_shelllink,nil,clsctx_inproc_server,IID_IShellLinkA,psl))) then

 begin

  hr:=psl.QueryInterface(iPersistFile,ppf);

  if succeeded(hr) then

  begin

  lpw:=stringtowidechar(lnkfilename,buf,MAX_PATH);

  hr := ppf.Load(lpw, STGM_READ);

  if succeeded(hr) then

  begin

  hr := psl.Resolve(0, SLR_NO_UI);

  if succeeded(hr) then

  begin

  if bSet then

  begin

  psl.SetArguments(info.Arguments);

  psl.SetDescription(info.Description);

  psl.SetHotkey(info.HotKey);

  psl.SetIconLocation(info.IconLocation,info.IconIndex);

  psl.SetIDList(info.ItemIDList);

  psl.SetPath(info.FileName);

  psl.SetShowCmd(info.ShowState);

  psl.SetRelativePath(info.RelativePath,0);

  psl.SetWorkingDirectory(info.WorkDirectory);

  result:=succeeded(psl.Resolve(0,SLR_UPDATE));

  end

  else

  begin

  psl.GetPath(info.FileName,MAX_PATH, wfd,SLGP_SHORTPATH );

  psl.GetIconLocation(info.IconLocation,MAX_PATH,info.IconIndex);

  psl.GetWorkingDirectory(info.WorkDirectory,MAX_PATH);

  psl.GetDescription(info.Description,CCH_MAXNAME);

  psl.GetArguments(info.Arguments,MAX_PATH);

  psl.GetHotkey(info.HotKey);

  psl.GetIDList(info.ItemIDList);

  psl.GetShowCmd(info.ShowState);

  result:=true;

  end;

  end;

  end;

  end;

end;

 finally

 freemem(buf);

 end;

end;

  2)建立快捷方式函式CreateLinkFile

說明:第一個引數為一個LINK_FILE_INFO結構,你必須進行初始化,第二個引數為要儲存快捷方式的檔名,預設為相同目錄下的同名的LNK檔案。

原型:

function CreateLinkFile(const info:LINK_FILE_INFO;const DestFileName:string=''):boolean;

var

 anobj:IUnknown;

 shlink:IShellLink;

 pFile:IPersistFile;

 wFileName:widestring;

begin

 wFileName:=destfilename;

 anobj:=CreateCom(CLSID_SHELLLINK);

 shlink:=anobj as IShellLink;

 pFile:=anobj as IPersistFile;

 shlink.SetPath(info.FileName);

 shlink.SetWorkingDirectory(info.WorkDirectory);

 shlink.SetDescription(info.Description);

 shlink.SetArguments(info.Arguments);

 shlink.SetIconLocation(info.IconLocation,info.IconIndex);

 shlink.SetHotkey(info.HotKey);

 shlink.SetShowCmd(info.ShowState);

 shlink.SetRelativePath(info.RelativePath,0);

 if DestFileName='' then

  wFileName:=ChangeFileExt(info.FileName,'lnk');

 result:=succeeded(pFile.Save(pwchar(wFileName),false));

end;

 

3)函式ShortCutToString用於將快捷方式中的熱鍵轉化成字串,以便於顯示,Delphi本身沒有提供將相關的函式。

function ShortCutToString(const HotKey:word):string;

var

 shift:tshiftstate;

begin

  shift:=[];

  if ((wordrec(HotKey).hi shr 0) and 1)<>0 then

  include(shift,ssshift);

  if ((wordrec(HotKey).hi shr 1) and 1)<>0 then

  include(shift,ssctrl);

  if ((wordrec(HotKey).hi shr 2) and 1)<>0 then

  include(shift,ssalt);

  result:=shortcuttotext(shortcut(wordrec(hotkey).lo,shift));

end;

 

4.  呼叫例項:

  新建一個Application,在窗體上放置一個OpenDialog,三個Button,一個Edit,設定OpenDialog的屬性Option部分的ofNoDereferenceLinks為true,Filter屬性為lnk file|*.lnk;然後為Button1、Button2和Button3分別新增如下程式碼(注意修改相應的檔名稱和路徑):

procedure TForm1.Button1Click(Sender: TObject);

var

info:LINK_FILE_INFO;

begin

if opendialog1.Execute then

 if LinkFileInfo(opendialog1.FileName,info) then

  begin  showmessage('FileName:'+info.filename+#13+'Description:'+info.Description+#13+'IconFilename:'+info.IconLocation+','+inttostr(info.IconIndex)+#13+'WorkDir:'+info.WorkDirectory+#13+'Arguments:'+info.Arguments+#13+'ShorCuts:'+shortcuttostring(info.HotKey)+#13+'WindowState:'+inttostr(info.ShowState)+#13+'ItemIDList:('+inttostr(info.itemidlist.mkid.cb)+',('+inttostr(info.itemidlist.mkid.abid[0])+'))');

  info.WorkDirectory:=edit1.text;

linkfileinfo(opendialog1.filename,info,true);

  end;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

shellexecute(handle,'open','start.exe','c:windowsdesktopaaa.lnk','',sw_hide);

end;

 

procedure TForm1.Button3Click(Sender: TObject);

var

info:LINK_FILE_INFO;

begin

strpcopy(info.filename,paramstr(0));  //快捷方式的目標檔名

info.Arguments:='/paramstr';  //設定程式執行的引數

info.Description:='Test For Link File';   //描述

info.HotKey:=0;   //沒有熱鍵

info.IconIndex:=0;   //第一個圖示

info.IconLocation:='';   //設定圖示檔案為本身

info.RelativePath:='windows';   //相對路徑

info.ShowState:=LNK_RUN_MAX;  //顯示最大化視窗

info.ItemIDList:=nil;  //保留未用,可以不設定

strpcopy(info.WorkDirectory,extractfilepath(paramstr(0))); //設定工作目錄

createLinkFile(info,'c:windowsdesktopproject.lnk');  //建立快捷方式

end;

5.  快捷方式的執行

  有兩種方法:

  第一種比較簡單,直接呼叫即可,但是受到一些制約—系統中必須存在start.exe檔案:

ShellExecute(handle,'open','start.exe','c:windowsdesktopaaa.lnk','',sw_hide);

  第二種就是取得LNK的資訊之後用ShellExecute進行呼叫!為簡單起見,不給出詳細的例子了。

  以上程式在Delphi 5.0+下透過。如果有什麼意見和建議,歡迎來信討論:

E_:Kingron@163


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987492/,如需轉載,請註明出處,否則將追究法律責任。

相關文章