开始菜单里的“快捷方式”,到底在磁盘的什么地方?

时间:2021-03-14 19:33:08
我用如下代码来获取“开始菜单”的位置:
char StartMenuPath[MAX_PATH];
LPITEMIDLIST PIDL;
SHGetSpecialFolderLocation(0, CSIDL_STARTMENU, &PIDL);
SHGetPathFromIDList(PIDL, StartMenuPath);
获取得的结果是:C:\Users\ttxyz\AppData\Roaming\Microsoft\Windows\Start Menu

可是我打开菜单,选择某个文件夹查看属性,结果发现它的位置确实是上述的那个,具体是:
C:\Users\ttxyz\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
后面跟了个子目录Programs,也不奇怪,这个文件夹是在开始菜单里的“程序”组里的。

但是我打开C:\Users\ttxyz\AppData\Roaming\Microsoft\Windows\Start Menu\Programs,发现里面确实有个freeime文件夹,但是里面是空的。奇怪,而开始菜单里的freeime文件里却不是空的,有好几项,我随便选择一项,看看它的属性,在属性的“常规”里发现它的位置是:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\freeime

这是怎么回事?开始菜单里的文件夹的位置明明是:C:\Users\ttxyz\AppData\Roaming\Microsoft\Windows\Start Menu\Programs,可是里面的快捷方式的位置却变成了:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\freeime

到底哪个目录才是开始菜单的位置?我安装程序的时候,应该把快捷方式建立在哪个位置?用什么函数获取?

谢谢!



7 个解决方案

#1


看起来好像开始菜单的构成是 C:\Users + C:\ProgramData
开始菜单的位置一般是前者

#2


引用 1 楼 dingxz105090 的回复:
看起来好像开始菜单的构成是 C:\Users + C:\ProgramData
开始菜单的位置一般是前者

可是我打开C:\Users\ttxyz\AppData\Roaming\Microsoft\Windows\Start Menu\Programs,里面的文件夹比开始菜单里的少好多,而且打开文件夹,里面好多都是空的,而开始菜单里的几乎所有文件夹都不是空的。

倒是C:\ProgramData\Microsoft\Windows\Start Menu\Programs\里面的文件夹和文件夹里面的内容能和开始菜单里的一一对应起来。那应该就是:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\ ?

那么安装程序建立该程序的文件夹并建立快捷方式的时候,就在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\里面建立?是吗?你的安装程序,是建立在哪个位置的?怎么获取这个位置?

#3


我的主贴里的获取开始菜单位置的代码就是选自你的。你用的是SHGetSpecialFolderLocation和SHGetPathFromIDList两个函数。

听说还有用SHGetSpecialFolderPath 和 SHGetFolderPath的。不知哪个更好?

#4


我已经用: SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS,  NULL, 0, StartMenuPath);
获取到了C:\ProgramData\Microsoft\Windows\Start Menu\Programs  这个位置。

在里面建立一个文件夹以后,在开始菜单中可以显示出来。我就准备这样做了,把程序的快捷方式都放在这个文件夹中,只是不知道这样做是不是对不对?是不是在任何情况下都是正确的?

#5


你不知道桌面和开始菜单是特殊的文件夹吗?他们本来位置就不是唯一的,而是两个位置的合集。玩 Windows 系统这应该是常识吧,你还不知道。在 Windows XP 上,用户文件夹内有个叫“All Users(所有用户)”的文件夹,从 Vista 开始,被改名为“Public(公用)”,其中储存的是电脑上所有用户公用的资料,也就是任何用户登录都会有的。Windows API 提供的获取系统特殊目录的方法除了能获取当前用户的路径,还能获取所有用户或者说公用用户的文件夹。
TCHAR szPath[MAX_PATH] = { 0 };
SHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, szPath);
MessageBox(NULL, szPath, TEXT("current"), MB_OK);
SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, szPath);
MessageBox(NULL, szPath, TEXT("public"), MB_OK);
上面是当前用户和公用用户的开始菜单程序目录获取方法。

同样的,桌面文件夹也可通过 CSIDL_DESKTOPDIRECTORY、CSIDL_COMMON_DESKTOPDIRECTOR 两个不同的 CSIDL 来获取。这些文件夹在简体中文系统上典型的路径如下:
Vista/7/8:
程序(当前):C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
桌面(当前):C:\Users\Administrator\Desktop
程序(公用):C:\ProgramData\Microsoft\Windows\Start Menu\Programs
桌面(公用):C:\Users\Public\Desktop
2000/XP:
程序(当前):C:\Documents and Settings\All Users\「开始」菜单\程序
桌面(当前):C:\Documents and Settings\Administrator\「开始」菜单\程序
程序(公用):C:\Documents and Settings\Administrator\桌面
桌面(公用):C:\Documents and Settings\All Users\桌面

实际上系统的桌面和开始菜单都是当前和公用位置的合并。也就是说,你在桌面上或者开始菜单里看到的东西不一定在同一个文件夹内。公用桌面或开始菜单内的文件是本机上所有用户的桌面或开始菜单都会显示,而当前用户桌面或开始菜单文件夹的文件则只在当前用户的桌面或开始菜单显示。

#6


写岔了:
程序(当前):C:\Documents and Settings\Administrator\「开始」菜单\程序
桌面(当前):C:\Documents and Settings\Administrator\桌面
程序(公用):C:\Documents and Settings\All Users\「开始」菜单\程序
桌面(公用):C:\Documents and Settings\All Users\桌面

#7


引用 5 楼 SXJIAKE 的回复:
你不知道桌面和开始菜单是特殊的文件夹吗?他们本来位置就不是唯一的,而是两个位置的合集。玩 Windows 系统这应该是常识吧,你还不知道。在 Windows XP 上,用户文件夹内有个叫“All Users(所有用户)”的文件夹,从 Vista 开始,被改名为“Public(公用)”,其中储存的是电脑上所有用户公用的资料,也就是任何用户登录都会有的。Windows API 提供的获取系统特殊目录的方法除了能获取当前用户的路径,还能获取所有用户或者说公用用户的文件夹。
TCHAR szPath[MAX_PATH] = { 0 };
SHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, szPath);
MessageBox(NULL, szPath, TEXT("current"), MB_OK);
SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, szPath);
MessageBox(NULL, szPath, TEXT("public"), MB_OK);
上面是当前用户和公用用户的开始菜单程序目录获取方法。

同样的,桌面文件夹也可通过 CSIDL_DESKTOPDIRECTORY、CSIDL_COMMON_DESKTOPDIRECTOR 两个不同的 CSIDL 来获取。这些文件夹在简体中文系统上典型的路径如下:
Vista/7/8:
程序(当前):C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
桌面(当前):C:\Users\Administrator\Desktop
程序(公用):C:\ProgramData\Microsoft\Windows\Start Menu\Programs
桌面(公用):C:\Users\Public\Desktop
2000/XP:
程序(当前):C:\Documents and Settings\All Users\「开始」菜单\程序
桌面(当前):C:\Documents and Settings\Administrator\「开始」菜单\程序
程序(公用):C:\Documents and Settings\Administrator\桌面
桌面(公用):C:\Documents and Settings\All Users\桌面

实际上系统的桌面和开始菜单都是当前和公用位置的合并。也就是说,你在桌面上或者开始菜单里看到的东西不一定在同一个文件夹内。公用桌面或开始菜单内的文件是本机上所有用户的桌面或开始菜单都会显示,而当前用户桌面或开始菜单文件夹的文件则只在当前用户的桌面或开始菜单显示。

非常非常之感谢!我确实对这个基本的东西不知道。原来如此。我是Win95时代过来的人。那时候开始菜单的文件夹好象只有一个。这么多年,对新出的系统不是很了解。

谢谢你的讲解,解决了我很多疑问,这些疑问如果没有搞清,很可能会走很多弯路,花很多时间。

#1


看起来好像开始菜单的构成是 C:\Users + C:\ProgramData
开始菜单的位置一般是前者

#2


引用 1 楼 dingxz105090 的回复:
看起来好像开始菜单的构成是 C:\Users + C:\ProgramData
开始菜单的位置一般是前者

可是我打开C:\Users\ttxyz\AppData\Roaming\Microsoft\Windows\Start Menu\Programs,里面的文件夹比开始菜单里的少好多,而且打开文件夹,里面好多都是空的,而开始菜单里的几乎所有文件夹都不是空的。

倒是C:\ProgramData\Microsoft\Windows\Start Menu\Programs\里面的文件夹和文件夹里面的内容能和开始菜单里的一一对应起来。那应该就是:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\ ?

那么安装程序建立该程序的文件夹并建立快捷方式的时候,就在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\里面建立?是吗?你的安装程序,是建立在哪个位置的?怎么获取这个位置?

#3


我的主贴里的获取开始菜单位置的代码就是选自你的。你用的是SHGetSpecialFolderLocation和SHGetPathFromIDList两个函数。

听说还有用SHGetSpecialFolderPath 和 SHGetFolderPath的。不知哪个更好?

#4


我已经用: SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS,  NULL, 0, StartMenuPath);
获取到了C:\ProgramData\Microsoft\Windows\Start Menu\Programs  这个位置。

在里面建立一个文件夹以后,在开始菜单中可以显示出来。我就准备这样做了,把程序的快捷方式都放在这个文件夹中,只是不知道这样做是不是对不对?是不是在任何情况下都是正确的?

#5


你不知道桌面和开始菜单是特殊的文件夹吗?他们本来位置就不是唯一的,而是两个位置的合集。玩 Windows 系统这应该是常识吧,你还不知道。在 Windows XP 上,用户文件夹内有个叫“All Users(所有用户)”的文件夹,从 Vista 开始,被改名为“Public(公用)”,其中储存的是电脑上所有用户公用的资料,也就是任何用户登录都会有的。Windows API 提供的获取系统特殊目录的方法除了能获取当前用户的路径,还能获取所有用户或者说公用用户的文件夹。
TCHAR szPath[MAX_PATH] = { 0 };
SHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, szPath);
MessageBox(NULL, szPath, TEXT("current"), MB_OK);
SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, szPath);
MessageBox(NULL, szPath, TEXT("public"), MB_OK);
上面是当前用户和公用用户的开始菜单程序目录获取方法。

同样的,桌面文件夹也可通过 CSIDL_DESKTOPDIRECTORY、CSIDL_COMMON_DESKTOPDIRECTOR 两个不同的 CSIDL 来获取。这些文件夹在简体中文系统上典型的路径如下:
Vista/7/8:
程序(当前):C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
桌面(当前):C:\Users\Administrator\Desktop
程序(公用):C:\ProgramData\Microsoft\Windows\Start Menu\Programs
桌面(公用):C:\Users\Public\Desktop
2000/XP:
程序(当前):C:\Documents and Settings\All Users\「开始」菜单\程序
桌面(当前):C:\Documents and Settings\Administrator\「开始」菜单\程序
程序(公用):C:\Documents and Settings\Administrator\桌面
桌面(公用):C:\Documents and Settings\All Users\桌面

实际上系统的桌面和开始菜单都是当前和公用位置的合并。也就是说,你在桌面上或者开始菜单里看到的东西不一定在同一个文件夹内。公用桌面或开始菜单内的文件是本机上所有用户的桌面或开始菜单都会显示,而当前用户桌面或开始菜单文件夹的文件则只在当前用户的桌面或开始菜单显示。

#6


写岔了:
程序(当前):C:\Documents and Settings\Administrator\「开始」菜单\程序
桌面(当前):C:\Documents and Settings\Administrator\桌面
程序(公用):C:\Documents and Settings\All Users\「开始」菜单\程序
桌面(公用):C:\Documents and Settings\All Users\桌面

#7


引用 5 楼 SXJIAKE 的回复:
你不知道桌面和开始菜单是特殊的文件夹吗?他们本来位置就不是唯一的,而是两个位置的合集。玩 Windows 系统这应该是常识吧,你还不知道。在 Windows XP 上,用户文件夹内有个叫“All Users(所有用户)”的文件夹,从 Vista 开始,被改名为“Public(公用)”,其中储存的是电脑上所有用户公用的资料,也就是任何用户登录都会有的。Windows API 提供的获取系统特殊目录的方法除了能获取当前用户的路径,还能获取所有用户或者说公用用户的文件夹。
TCHAR szPath[MAX_PATH] = { 0 };
SHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, szPath);
MessageBox(NULL, szPath, TEXT("current"), MB_OK);
SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, szPath);
MessageBox(NULL, szPath, TEXT("public"), MB_OK);
上面是当前用户和公用用户的开始菜单程序目录获取方法。

同样的,桌面文件夹也可通过 CSIDL_DESKTOPDIRECTORY、CSIDL_COMMON_DESKTOPDIRECTOR 两个不同的 CSIDL 来获取。这些文件夹在简体中文系统上典型的路径如下:
Vista/7/8:
程序(当前):C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
桌面(当前):C:\Users\Administrator\Desktop
程序(公用):C:\ProgramData\Microsoft\Windows\Start Menu\Programs
桌面(公用):C:\Users\Public\Desktop
2000/XP:
程序(当前):C:\Documents and Settings\All Users\「开始」菜单\程序
桌面(当前):C:\Documents and Settings\Administrator\「开始」菜单\程序
程序(公用):C:\Documents and Settings\Administrator\桌面
桌面(公用):C:\Documents and Settings\All Users\桌面

实际上系统的桌面和开始菜单都是当前和公用位置的合并。也就是说,你在桌面上或者开始菜单里看到的东西不一定在同一个文件夹内。公用桌面或开始菜单内的文件是本机上所有用户的桌面或开始菜单都会显示,而当前用户桌面或开始菜单文件夹的文件则只在当前用户的桌面或开始菜单显示。

非常非常之感谢!我确实对这个基本的东西不知道。原来如此。我是Win95时代过来的人。那时候开始菜单的文件夹好象只有一个。这么多年,对新出的系统不是很了解。

谢谢你的讲解,解决了我很多疑问,这些疑问如果没有搞清,很可能会走很多弯路,花很多时间。