在Delphi中操作快捷方式 (轉)
在中操作快捷方式
快捷方式減少了的重複,是啟動或開啟檔案或資料夾的方法,快捷方式對經常使用的程式、檔案和資料夾非常有用。在系統中,充斥著大量的快捷方式,那麼如何操作這些快捷方式就是一個很頭疼的問題,在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在DELPHI2.0/3.0中直接操作埠 (轉)
- 在DELPHI中圖片轉換
- delphi中的時間操作技術(1) (轉)
- delphi中的時間操作技術(2) (轉)
- 在DELPHI程式中撥號上網 (轉)
- 在Delphi中巧用WINDOWS 的API函式 (轉)WindowsAPI函式
- 在Delphi中實現圖片的旋轉、縮放 (轉)
- delphi中關於字串的操作字串
- 在.NET中操作XmlDocument (轉)XML
- 在Delphi中實現任意形狀的窗體 (轉)
- 在Delphi中捕獲控制檯程式的輸出 (轉)
- 在Delphi中編寫控制元件的基本方法 (轉)控制元件
- 在Delphi中使用Queued 元件 (轉)元件
- 在Delphi中編寫控制元件的基本方法(1) (轉)控制元件
- 用Delphi在區域網中實現網上影院 (轉)
- 用BCB在windows桌面建立快捷方式 (轉)Windows
- Delphi中儲存影像列表 (轉)
- Delphi中的類和物件 (轉)物件
- 在Delphi程式設計中獲取作業系統資訊 (轉)程式設計作業系統
- 在Delphi中使用IP控制元件 (轉)控制元件
- 在delphi中使用flash控制元件 (轉)控制元件
- 利用Delphi 5中呼叫Excel 97 (轉)Excel
- Delphi中布林型別辨析 (轉)型別
- codesoft在delphi,C#中的例子C#
- Delphi字串指標操作字串指標
- DLL檔案在Delphi的建立及呼叫 (轉)
- Delphi中停靠技術的實現 (轉)
- Linux:ubuntu桌面操作快捷方式LinuxUbuntu
- 在C、JAVA、PHP中操作postgreSql資料庫 (轉)JavaPHPSQL資料庫
- 用好Windows快捷方式【轉】Windows
- Delphi 6 SOAP 原始碼中的BUG修正 (轉)原始碼
- Delphi 中的字串——《Delphi6 開發人員指南》讀書筆記 (轉)字串筆記
- Delphi與Excel (轉)Excel
- 在JavaScript中操作CookieJavaScriptCookie
- 在Delphi中處理資料庫日期型欄位的顯示與輸入 (轉)資料庫
- Delphi 中big5 轉 Unicode 函式Unicode函式
- Delphi(BCB)中編譯器版本宏定義 (轉)編譯
- Delphi6/7 中XML 文件的應用 (轉)XML