如何获取(逻辑)桌面上的项目总数(C#)
Posted
技术标签:
【中文标题】如何获取(逻辑)桌面上的项目总数(C#)【英文标题】:How to get the total number of items on the (logical) desktop (C#) 【发布时间】:2011-09-15 06:48:23 【问题描述】:让我详细说明。 “项目”是指您在桌面(Windows)中看到的所有项目,其中包括“我的电脑”、“回收站”、所有快捷方式等。如果我选择桌面上的所有项目,我会在属性中获得计数显示。这是我想要的计数,以编程方式。
我面临的问题:
我们看到的桌面有我帐户中的项目,还有All Users
的桌面项目以及其他快捷方式,如“我的电脑”、“回收站”。总共3件事。所以我不能只从桌面目录的物理路径中获取项目数。所以这失败了:
int count =
Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder
.DesktopDirectory)
).Length;
我知道SpecialFolder.Desktop
代表我们所看到的逻辑桌面。但这又失败了,因为GetFolderPath()
再次获得了用户桌面的物理路径:
int count =
Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder
.Desktop)
).Length;
在用户桌面上获取总计数的正确方法是什么?
【问题讨论】:
你需要枚举shell文件夹,比“文件”想得更广泛 桌面至少在某些版本的 Windows 中是作为 ListView 组件实现的,通过一点 P/Invoking 你应该可以得到显示的项目总数。 @C.Evenhuis 在有完美的公共 API 时不会破解! @David Heffernan ,我如何获取 shell 文件夹?代码 sn-p? @nawfal:看这个帖子:social.msdn.microsoft.com/forums/en-US/winforms/thread/… 【参考方案1】:Windows shell 对此提供全面而全面的支持。
-
致电
SHGetDesktopFolder()
获取桌面版IShellFolder
。
拨打IShellFolder::EnumObjects()
获取内容。
这个Code Project article 从 C# 的角度给出了一些使用示例。
【讨论】:
【参考方案2】:这是不可能的。
您可能忘记了任何桌面上的元素,这些元素与文件无关(文件或链接),而是基于注册表的,您会非常想念它们。
【讨论】:
这将给出用户配置文件下的所有项目,而不仅仅是用户桌面上可见的项目 我没有看到Environment.SpecialFolder.CommonDesktopDirectory
列出。我正在使用 C# 2.0
我没有看到Environment.SpecialFolder.UserProfile
再次列出。 C# 2.0 中的等价物是什么?
@Artur Mustafin ,是的,但肯定有办法以编程方式找到它。
Piffle,你只需要使用shell API!【参考方案3】:
我正在为自己回答我最终在此处发布的提示和链接的帮助下找到的答案。
private const uint GET_ITEM_COUNT = 0x1000 + 4;
[DllImport("user32.DLL")]
private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
[DllImport("user32.DLL")]
private static extern IntPtr FindWindow(string lpszClass, string lpszWindow);
[DllImport("user32.DLL")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter,
string lpszClass, string lpszWindow);
public static int GetDesktopCount()
//Get the handle of the desktop listview
IntPtr vHandle = FindWindow("Progman", "Program Manager");
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SysListView32", "FolderView");
//Get total count of the icons on the desktop
int vItemCount = SendMessage(vHandle, GET_ITEM_COUNT, 0, 0);
return vItemCount;
与此同时,我开始学习一件有趣(相当烦人!)的事情。您在屏幕上看到的桌面与桌面的文件夹视图不同。即使您取消选中“我的电脑”和“我的文档”位于桌面(您在显示器上看到的桌面),这些图标仍会出现在桌面的文件夹视图中。我尝试了link 中给出的解决方案,但它给出了文件夹视图中存在的项目数。我在上面发布的解决方案将产生我想要的完美结果。解决方案来自叶志新here。感谢@C.Evenhuis 的提示。
【讨论】:
您在这里依赖于未记录的行为,通过在 Explorer 的窗口层次结构中徘徊并假设桌面上的图标由列表视图呈现。 @Raymond,但这种方法救了我的命。我找不到其他解决方案的输出。可能是我缺乏知识,无论如何我无法调整您推荐的代码 sn-p 以获得我想要的输出。 这是一种非常糟糕的方法,可能会在未来的 Windows 版本中失效。 @David Heffernan,我在 Shell 和 API 方面没有足够的专业知识,所以没有什么能解决我的问题。我也无法在网上找到有效的解决方案。如果您能提供,我将不胜感激。 我相信微软提供了一个 C# 代码包,用于在托管代码中进行 shell 编程。我没有它的链接,但你可以尝试搜索它。请不要将此代码发送给客户 - 它很可能在未来版本的 Windows 中停止工作,然后您的客户将被卡住。以上是关于如何获取(逻辑)桌面上的项目总数(C#)的主要内容,如果未能解决你的问题,请参考以下文章