如何在windows"开始-程序"菜单中添加和删除菜单项?高分送!
我在制作一个安装程序,如何在windows"开始-程序"菜单中添加和删除菜单项? 问题点数:100、回复次数:8Top
1 楼yiph(逸飘寒)回复于 2005-03-02 18:59:24 得分 0
SHGetSpecialFolderLocation
SHGetPathFromIDListTop
2 楼rouqing(*冰雨&双子座奇缘*)回复于 2005-03-02 20:30:31 得分 0
Study...Top
3 楼linbren(lin)回复于 2005-03-02 23:24:05 得分 0
没用过,但是用installshell应该可以....Top
4 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-03-02 23:46:19 得分 100
uses
ShlObj, ActiveX;
procedure FreePidl(pidl: PItemIDList);
var
allocator: IMalloc;
begin
if Succeeded(SHGetMalloc(allocator)) then
begin
allocator.Free(pidl);
{$IFDEF VER100}
allocator.Release;
{$ENDIF}
end;
end;
function GetCommonPrograms: string;
var
pidl: PItemIDList;
buf: array[0..MAX_PATH] of Char;
begin
if Succeeded(SHGetSpecialFolderLocation(Form1.Handle,CSIDL_COMMON_PROGRAMS{所有用户[开始]-[程序]}, pidl)) then
SHGetPathFromIDList(pidl, buf); //CSIDL_STARTMENU 当前用户[开始]菜单
Result := StrPas(buf); //CSIDL_COMMON_STARTMENU 所有用户[开始]菜单
//CSIDL_COMMON_PROGRAMS 所有用户[开始]-[程序]
//CSIDL_COMMON_STARTUP 所有用户[开始]-[程序]-[启动]
//CSIDL_DESKTOP 当前用户[桌面]
//CSIDL_PROGRAMS 当前用户[开始]-[程序]
//CSIDL_PERSONAL 当前用户[My Document]我的文档
//CSIDL_FAVORITES 当前用户[收藏夹]
//CSIDL_STARTUP 当前用户[开始]-[程序]-[启动]
//CSIDL_RECENT 当前用户[Recent]文件夹
//CSIDL_SENDTO 当前用户[SendTo]文件夹
//CSIDL_DESKTOPDIRECTORY 当前用户[桌面]
//CSIDL_NETHOOD 当前用户[NetHood]网上邻居
//CSIDL_FONTS 字体文件夹
//CSIDL_TEMPLATES 当前用户[Templates]临时文件目录
//CSIDL_COMMON_DESKTOPDIRECTORY 所有用户[桌面]
//CSIDL_APPDATA 当前用户[Application Data]目录
//CSIDL_PRINTHOOD 当前用户[PrintHood]目录
//CSIDL_COMMON_FAVORITES 所有用户[Favorites]收藏夹
//CSIDL_INTERNET_CACHE 当前用户IE浏览器临时文件夹
//CSIDL_COOKIES 当前用户[Cookies]目录
//CSIDL_HISTORY 当前用户[History]历史记录目录
// The calling application is responsible for freeing the PItemIDList-pointer
// with the Shell's IMalloc interface
FreePIDL(pidl);
end;
----------------------------------------
用法:
label1.Caption := GetCommonPrograms;Top
5 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-03-02 23:47:15 得分 0
使用上述方法获取到相应目录之后就可以在该目录下进行如创建目录,快捷方式,删除等操作。Top
6 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-03-02 23:50:25 得分 0
添加个在开始菜单创建目录的实例:
Uses
ShlObj, ActiveX;
procedure FreePidl(pidl: PItemIDList);
var
allocator: IMalloc;
begin
if Succeeded(SHGetMalloc(allocator)) then
begin
allocator.Free(pidl);
{$IFDEF VER100}
allocator.Release;
{$ENDIF}
end;
end;
function CreateFolder(aFolderName: string; aLocation: Integer): Boolean;
var
pIdl: PItemIDList;
hPath: PChar;
begin
Result := False;
if SUCCEEDED(SHGetSpecialFolderLocation(0, aLocation, pidl)) then
begin
hPath := StrAlloc(MAX_PATH);
SHGetPathFromIDList(pIdl, hPath);
SetLastError(0);
CreateDirectory(PChar(hPath + '\\' + aFolderName), nil);
if (GetLastError = 0) or (GetLastError = ERROR_ALREADY_EXISTS) then
Result := True;
FreePIDL(pIdl);
StrDispose(hPath);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateFolder('MyProgramgroup', CSIDL_PROGRAMS);
end;
Top
7 楼leeshine(LeeShine_Soft)回复于 2005-03-03 00:25:15 得分 0
sou cang dai ma!thanksTop
8 楼caiso(十年磨一剑)回复于 2005-03-04 10:40:18 得分 0
顶一下Top




