通过桌面图标的快捷方式打开程序?

hjkto 2009-11-01 08:35:42
如何通过遍历桌面的快捷方式,找到包含指定关键字的快捷方式图标,如”腾讯“,或”QQ“打开程序?
...全文
212 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjkto 2009-11-01
  • 打赏
  • 举报
回复
上面的函数,我也百度到了
我现在需要遍历当前用户的桌面文件夹,找到我要的lnk
if findfirst(UserProfile+'\桌面\*.lnk',faanyfile,ser)=0 then
要用到UserProfile此环境变量,不知怎么写?
我上面错的,正确的应该怎么写?
iseekcode 2009-11-01
  • 打赏
  • 举报
回复
转贴:

delphi-读快捷方式信息
先来个简单的。用的Com。
procedure GetLinkInfo(const strLinkFile: string);
var
objUnknown: IUnknown;
objShellLink: IShellLink;
objPerFile: IPersistFile;
wstrLinkFile: WideString;
wfd: WIN32_FIND_DATA;
begin
wstrLinkFile := strLinkFile;
try
OleInitialize(nil);
objUnknown := CreateComObject(CLSID_ShellLink);
objShellLink := objUnknown as IShellLink;
objPerFile := objUnknown as IPersistFile;
objPerFile.Load(PWideChar(wstrLinkFile), 0);
{好了,下面再用objShellLink.GetXXX(...)去读取你想要的属性吧,很简单了,自己处理...}
finally
OleUninitialize;
end;
end;
再来个老一点儿的方法:2个都能读出来,都能用
function test(const aStr:string):string;
var
info:LINK_FILE_INFO;

function LinkFileInfo(const lnkFileName:string;var info:LINK_FILE_INFO;const bSet:boolean):boolean;
var
hr:hresult;
psl:IShelllink;
wfd:win32_find_data;
ppf:IPersistFile;
lpw:pwidechar;
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 ;

begin
if LinkFileInfo(aStr,info,False) then
Result:=info.FileName;
end;
是的很长。
不过原理都一样 都是com,微软的接口
s11ss 2009-11-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hjkto 的回复:]
上面的函数,我也百度到了
我现在需要遍历当前用户的桌面文件夹,找到我要的lnk
if findfirst(UserProfile+'\桌面\*.lnk',faanyfile,ser)=0 then
要用到UserProfile此环境变量,不知怎么写?
我上面错的,正确的应该怎么写?

[/Quote]
procedure TForm1.Button1Click(Sender: TObject);
function GetEnvironmentVarValue(const v: string): string;
const
MAX = 256;
var
buf: array[0..MAX - 1] of Char;
begin
ExpandEnvironmentStrings(PAnsiChar('%' + v + '%'), buf, MAX);
Result := buf;
end;
begin
ShowMessage(GetEnvironmentVarValue('UserProfile'));
end;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧