如何在 c# 中排列或排序桌面图标?



您知道当您右键单击桌面时,有一个"排序方式"选项允许您按"名称"、"大小"、"项目类型"或"修改日期"对图标进行排序吗?好吧,我想找到一种方法,只需按一下按钮即可对桌面的图标进行排序。

我在stackoverflow上看到了一个类似的问题,但它很旧,代码对我不起作用。问题的链接是:使用 C# 排列桌面图标。我正在尝试在 Windows 10 中实现这一目标。

那里有一条评论说LVM_*和LVA_*值存储在SDK附带的commctrl.h文件中。由于某种原因,我找不到该文件。

这是我正在使用的:

//sort desktop
public const int LVM_ARRANGE = 4118;
public const int LVM_ALIGNLEFT = 1;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetDesktopWindow(); 

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
//end of sort desktop 
private void organizeBtn_Click(object sender, EventArgs e)
{
var DesktopHandle = GetDesktopWindow();
MessageBox.Show(GetDesktopWindow().ToString());
SendMessage(GetDesktopWindow(), LVM_ARRANGE, LVM_ALIGNLEFT, 0);
}

我一直在挖掘有关此主题的信息或某种方向,尤其是有关 windows 10 的信息,但我找不到太多。 请帮忙?

在Windows10中,桌面(不是平铺世界!)仍然是SysListView32,但GetDesktopWindowAPI调用将返回其祖父级的句柄,一个Progman窗口 - 让人想起Windows 3.0的古老"程序管理器"。然后是SHELLDLL_DefView类的填充程序,下面是埋藏着你所追求的列表视图。

使用此答案中的信息从 shell 窗口向下移动到文件夹视图,您最终可以发送LVM_ARRANGE消息。

这是一种脆弱的方法,因为它依赖于操作系统的未记录属性,这些属性可能随时随着更新或新版本而更改。当用户使用幻灯片作为桌面背景时,它也可能会中断,因为 Windows 会重新排列桌面窗口堆栈。在这里破解来处理这个问题。

另一种有文档记录且不太可能在未来版本中中断的方法,其缺点是涉及 COM 和 C# 的噩梦,是通过 shell 自动化IFolderView,这里和这里有两个相关的发现。

最新更新